Sehr eigenartiger LNK2001



  • Hi,

    ich versteh' die Welt nicht mehr... ich habe folgenden Code:

    main.cpp

    #include "testCamContext.h"
    
    test::TestCamContext *context = 0;
    
    int main( int argc, char **argv )
    {
    	context = new test::TestCamContext();
    	test::TestCamBase *cam = context->createCamera();
    
    	return 0;
    }
    

    testCamContext.h

    #pragma once
    
    #include "testCam.h"
    
    namespace test
    {
    	class TestCamContext
    	{
    	public:
    		TestCamContext();
    		~TestCamContext();
    
    		TestCamBase *createCamera();
    	};
    }
    

    testCamContext.cpp

    #include "testCamContext.h"
    
    using namespace test;
    
    TestCamContext::TestCamContext()
    {}
    
    TestCamContext::~TestCamContext()
    {}
    
    TestCamBase *TestCamContext::createCamera()
    {
    	return new TestCam();
    }
    

    testCam.h

    #pragma once
    
    namespace test
    {
    	class TestCamBase
    	{
    	private:
    	public:
    		TestCamBase()			{}
    		virtual ~TestCamBase()	{}
    	};
    
    	class TestCam : public TestCamBase
    	{
    	private:
    	public:
    		TestCam();
    		virtual ~TestCam();
    	};
    }
    

    testCam.cpp

    #include "testCam.h"
    
    using namespace test;
    
    TestCam::TestCam() :
    	TestCamBase()
    {}
    
    TestCam::~TestCam()
    {}
    

    So weit, so einfach. Wenn ich das in Visual Studio 2013 (12.0.30501.00 Update 2) compiliere, dann bekomme ich einen Linker-Fehler:

    Error 1 error LNK2001: unresolved external symbol "public: __thiscall test::TestCam::TestCam(void)" (??0TestCam@test@@QAE@XZ) D:\work\-coding-\someproject\testCamContext.obj someproject

    Das pikante daran ist jetzt, dass der EXAKT SELBE Code in einem anderen Projekt ohne Probleme baut (ich habe die h/cpp-Dateien im Filesystem kopiert, es sind außer diesen 5 Dateien keine weiteren vorhanden). Ich habe auch Clean/Rebuild schon mehrmals versucht.

    Kopiere ich außerdem die Deklarationen und Definitionen aus TestCam.h/cpp in TestCamContext.h/cpp geht's. Kopier' ich wieder zurück, geht's nicht mehr.

    Das Problem ist eigentlich aus einem größeren Projekt entstanden, das ich jetzt soweit ausgemistet habe, bis das Konstrukt, das ich oben gepostet habe, übrig geblieben ist. Es hilft mir also nicht, wenn ich weiß, ich könnte den Code einfach rüberkopieren, um in meinem Softwareprojekt das Problem zu beheben müsste ich die Ursache kennen.

    Hat irgendjemand Erfahrung mit ähnlich merkwürdigem Verhalten? Wie würdet ihr das Problem angehen?

    Danke,
    iko



  • Wird testCam.cpp übersetzt?
    Wenn ja: steht der Konstruktor im obj (objdump verwenden)?

    Grundsätzlich: using namespace ist nicht unbedingt schön, aber wenn es dann auch noch bei der Funktionsdefinition benutzt wird, wird es echt pervers.



  • Bzw. auf Windows dumpbin.



  • Vielen Dank für die rasche Antwort, manni66, ich hätt auch mal nach den obj-Files schauen können, stimmt. 🙄

    Ich hab in der Zwischenzeit die Projektfiles der funktionierenden und der nicht funktionierenden Version verglichen und festgestellt, dass in letzterer das hier zu finden war:

    <ItemGroup>
        <ClCompile Include="..\src\testCamContext.cpp" />
        <ClCompile Include="..\src\main.cpp" />
      </ItemGroup>
      <ItemGroup>
        <ClInclude Include="..\src\testCam.h" />
        <ClInclude Include="..\src\testCamContext.h" />
      </ItemGroup>
      <ItemGroup>
        <None Include="..\src\testCam.cpp" />
      </ItemGroup>
    

    In ersterer ging's, weil ich während dem vielen Herumprobieren mal die Files raus- und wieder reingenommen habe. Hab jetzt auch gesehen, dass in den Configuration Properties unter "Item Type" statt "C/C++ compiler" "does not participate in build" stand. Das kannte ich garnicht, ich kenne nur "Excluded From Build - Yes/No", was dass im Solution Explorer ja deutlich sichtbar ist, wenn's verstellt ist. Keine Ahnung, wie der Item Type umgefallen ist. Bis heute morgen um 2 ging's, und dann plötzlich nicht mehr, drum war ich schon irgendwie verbohrt in die Idee, dass es was mit dem Code sein muss...

    manni66 schrieb:

    using namespace ist nicht unbedingt schön, aber wenn es dann auch noch bei der Funktionsdefinition benutzt wird, wird es echt pervers.

    Ist wohl Geschmackssache, ich find das jetzt nicht grad pervers. Gegenvorschlag? Alles ausschreiben? O_o



  • iko79 schrieb:

    Ist wohl Geschmackssache, ich find das jetzt nicht grad pervers. Gegenvorschlag? Alles ausschreiben? O_o

    Für schreibfaule:

    namespace test
    {
    TestCam::TestCam() :
        TestCamBase()
    {}
    
    TestCam::~TestCam()
    {}
    }
    

Log in to reply