Linkerfehler bei VS2003 Projekten erstellt mit CMake



  • Hallo!

    Entschuldigung, falls das hier im falschen Forum gelandet ist, ich war mir nicht sicher...

    Ich habe ein kleines linker Problem. Aber ich fange lieber am Anfang an:

    Ich habe in den letzen 10 Monaten eine kleine Bildverarbeitungsbibliothek geschrieben, hauptsaechlich um Uebung im Programmieren zu bekommen. Da ich unter Windows programmiere, habe ich mich dazu entschlossen, diese Bibliothek statisch zu machen ( also als .lib datei ).
    Ein neues Projekt muss ich also nur gegen meine .lib linken, und die entsprechenden header einfuegen, und schon kann ich auf alles zugreifen.. das funktioniert problemlos in Konsolenanwendungen mit Visual Studio 2003.

    Ich moechte jetzt gerne ein paar Beispiele mit Qt realisieren, allerdings bekomme ich dann "already defined in.." linker fehlermeldungen, und zwar fuer jegliche Klassen/Funktionen aus meiner Bibliothek, in deren .cpp Datei irgendwas aus der STL inkludiert wird (denke ich).
    Das Problem taucht nicht auf, wenn ich diese cpp Dateien dem Projekt hinzufuege. Nur wuerde ich das gerne vermeiden, und nur die .lib datei verwenden.

    Ich erstelle fuer die Qt Programme mein vs7 Projekt mit CMake, allerdings taucht das Problem immer auf, egal ob ich mit Qt linke oder nicht. Daher habe ich das hier auch nicht im Qt Forum geschrieben.

    Eine der Fehlermeldungen:

    error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::~basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(void)" (??1?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ) already defined in flib.lib(FImage.obj)

    Wenn ich die entsprechende Datei (FImage.cpp) dem Projekt hinzufuege, dann ist der Fehler weg. Ausserdem kommt diese Fehlermeldung (soweit ich das durch Testen herrausfinden koennte) nur, falls in den entsprechenden .cpp und .h Dateien etwas aus der STL eingebunden wird.

    Uebersehe ich irgendetwas Grundlegendes, oder wo liegt das Problem?

    Ueber Eure Ideen / Hilfe bedanke ich mich schonmal im Vorraus!

    Fritz



  • Ich kenne mich zwar nicht so gut mit CMake aus, aber hast du die Runtime eventuell statisch gelinkt?

    MfG Kimmi



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo Kimmi.

    ich kann Dir diese Frage nicht wirklich beantworten. Ich hab einfach das Minimalbeispiel verwendet:

    /////////////
    CMakeLists.txt:
    PROJECT ( TEST )

    ADD_EXECUTABLE( qtwrapping qtwrappingmain.cpp )

    TARGET_LINK_LIBRARIES( qtwrapping flib )
    /////////////

    qtwrapping fatal error LNK1169: one or more multiply defined symbols found
    qtwrapping warning LNK4098: defaultlib 'LIBC' conflicts with use of other libs; use /NODEFAULTLIB:library
    qtwrapping error LNK2005: "public: unsigned int __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::size(void)const " (?size@?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@QBEIXZ) already defined in flib.lib(FImage.obj) qtwrapping error LNK2005: "public: class std::basic\_string,class std::allocator > & \_\_thiscall std::basic\_string,class std::allocator >::erase(unsigned int,unsigned int)" (?erase@?basic_string@DU?chartraits@D@std@@V?char_traits@D@std@@V?allocator@D@2@@std@@QAEAAV12@II@Z) already defined in flib.lib(FImage.obj)
    qtwrapping error LNK2005: "public: unsigned int __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::max_size(void)const " (?max_size@?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@QBEIXZ)alreadydefinedinflib.lib(FImage.obj)qtwrappingerrorLNK2005:"public:__thiscallstd::basic_string<char,structstd::char_traits<char>,classstd::allocator<char>>::basic_string<char,structstd::char_traits<char>,classstd::allocator<char>>(charconst)"(??0?allocator@D@2@@std@@QBEIXZ) already defined in flib.lib(FImage.obj) qtwrapping error LNK2005: "public: \_\_thiscall std::basic\_string<char,struct std::char\_traits<char>,class std::allocator<char> >::basic\_string<char,struct std::char\_traits<char>,class std::allocator<char> >(char const *)" (??0?basic_string@DU?chartraits@D@std@@V?char_traits@D@std@@V?allocator@D@2@@std@@QAE@PBD@Z) already defined in flib.lib(FImage.obj)
    qtwrapping error LNK2005: "public: __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0?basic_string@DU?basic\_string@DU?char_traits@D@std@@V?allocator@D@2@@std@@QAE@ABV01@@Z)alreadydefinedinflib.lib(FImage.obj)qtwrappingerrorLNK2005:"public:__thiscallstd::basic_string<char,structstd::char_traits<char>,classstd::allocator<char>>:: basic_string<char,structstd::char_traits<char>,classstd::allocator<char>>(void)"(??1?allocator@D@2@@std@@QAE@ABV01@@Z) already defined in flib.lib(FImage.obj) qtwrapping error LNK2005: "public: \_\_thiscall std::basic\_string<char,struct std::char\_traits<char>,class std::allocator<char> >::~basic\_string<char,struct std::char\_traits<char>,class std::allocator<char> >(void)" (??1?basic_string@DU?chartraits@D@std@@V?char_traits@D@std@@V?allocator@D@2@@std@@QAE@XZ) already defined in flib.lib(FImage.obj)

    Fritz



  • Kann es sein, dass deine QT-Fassung nicht die Runtime multithread-fähig gelnkt hat? Wo hast du die denn her?

    MfG Kimmi


Anmelden zum Antworten