Linkerprobleme in Multiproject



  • Ich verzweifle so langsam bei der Kompilierung einer Solution, welche aus vier Projekten besteht. (Drei werden zu Libraries kompiliert (Unterprojekte) und in das vierte (Hauptprojekt) eingebunden.) Alles war wunderbar, bis ich in einem der "Unterprojekte" die Boost Lib eingebunden habe.

    Kurz zur Rahmenhandlung:
    - A,B,C werden mit ihren Libs statisch gelinkt und als Libraries in D kompiliert.

    - A, B und C verwenden .h Dateien von D.

    - B und D verwenden .h Dateien von A.

    - A verwendet die Boost Lib.

    - A, B und C lassen sich einzeln ohne Fehler kompilieren.

    Jetzt das Problem:
    Möchte ich jetzt die gesamte Solution kompilieren, laufen die ersten drei fehlerfrei durch. Beim "linken" von D treten folgende Fehler auf:
    **
    Variante a** (pfad von boostlib nicht in den "additional library directories" angegeben):
    LINK : fatal error LNK1104: cannot open file 'libboost_system-vc90-mt-sgd-1_44.lib'

    **
    Variante b** (pfad von boostlib in den "additional libraries" angegeben):
    **...
    libcpmtd.lib(xmbtowc.obj) : error LNK2019: unresolved external symbol __ui64toa_s referenced in function __CreateLocForCP
    libcpmtd.lib(xgetwctype.obj) : error LNK2019: unresolved external symbol ___crtGetStringTypeW referenced in function __Getwctype
    libboost_thread-vc90-mt-sgd-1_44.lib(thread.obj) : error LNK2019: unresolved external symbol __beginthreadex referenced in function "private: void __thiscall boost::thread::start_thread(void)" (?start_thread@thread@boost@@AAEXXZ)
    libboost_thread-vc90-mt-sgd-1_44.lib(thread.obj) : error LNK2019: unresolved external symbol __alldiv referenced in function "union _LARGE_INTEGER __cdecl boost::this_thread::`anonymous namespace'::get_due_time(struct boost::detail::timeout const &)" (?get_due_time@?A0x3bf07b89@this_thread@boost@@YA?AT_LARGE_INTEGER@@ABUtimeout@detail@3@@Z)
    libboost_thread-vc90-mt-sgd-1_44.lib(thread.obj) : error LNK2019: unresolved external symbol __allrem referenced in function "public: long __thiscall boost::date_time::time_duration<class boost::posix_time::time_duration,class boost::date_time::time_resolution_traits<struct boost::date_time::time_resolution_traits_adapted64_impl,5,1000000,6,long> >::minutes(void)const " (?minutes@?time_duration@V0posix_time@boost@@V?time\_duration@V0posix\_time@boost@@V?time_resolution_traits@Utime_resolution_traits_adapted64_impl@date_time@boost@@$04$0PECEA@05J@date_time@2@@datetime@boost@@QBEJXZ)libboost_threadvc90mtsgd1_44.lib(thread.obj):errorLNK2019:unresolvedexternalsymbol__gmtime64referencedinfunction_gmtimelibboost_threadvc90mtsgd1_44.lib(thread.obj):errorLNK2019:unresolvedexternalsymbol__aullremreferencedinfunction"private:staticclassboost::posix_time::ptime__cdeclboost::date_time::microsec_clock<classboost::posix_time::ptime>::create_time(structtm(__cdecl)(__int64const,structtm))"(?create_time@?05J@date\_time@2@@date_time@boost@@QBEJXZ) libboost\_thread-vc90-mt-sgd-1\_44.lib(thread.obj) : error LNK2019: unresolved external symbol \_\_gmtime64 referenced in function \_gmtime libboost\_thread-vc90-mt-sgd-1\_44.lib(thread.obj) : error LNK2019: unresolved external symbol \_\_aullrem referenced in function "private: static class boost::posix\_time::ptime \_\_cdecl boost::date\_time::microsec\_clock<class boost::posix\_time::ptime>::create\_time(struct tm * (\_\_cdecl*)(\_\_int64 const *,struct tm *))" (?create\_time@?microsec_clock@Vptime@posix_time@boost@@@date_time@boost@@CA?AVptime@posix_time@3@P6APAUtm@@PB_JPAU6@@Z@Z)
    libboost_thread-vc90-mt-sgd-1_44.lib(tss_pe.obj) : error LNK2001: unresolved external symbol __tls_used
    LibMainD.lib(fimJpegIo.obj) : error LNK2019: unresolved external symbol ___CxxLongjmpUnwind@4 referenced in function "bool __cdecl fimLoadJpeg(unsigned char const *,unsigned long,class FimImgT<class FimRgbaT<unsigned char> > &)" (?fimLoadJpeg@@YA_NPBEKAAV?FimImgT@V?FimImgT@V?FimRgbaT@E@@@@@Z)
    LibWinD.lib(fimTgaIo.obj) : error LNK2019: unresolved external symbol __RTC_UninitUse referenced in function "bool __cdecl fimTgaParseUncompressedColourMapData(struct _iobuf ,struct FimTgaHeaderS const &,class std::vector<unsigned long,class std::allocator<unsigned long> > const &,struct FimTgaExtensionS const ,class FimImgT<class FimRgbaT<unsigned char> > &)" (?fimTgaParseUncompressedColourMapData@@YA_NPAU_iobuf@@ABUFimTgaHeaderS@@ABV?vector@KV?vector@KV?allocator@K@std@@@std@@PBUFimTgaExtensionS@@AAV?FimImgT@V?FimImgT@V?FimRgbaT@E@@@@@Z)
    LibJpegIjg6bD.lib(jerror.obj) : error LNK2019: unresolved external symbol _fprintf referenced in function _output_message
    LibJpegIjg6bD.lib(jmemmgr.obj) : error LNK2019: unresolved external symbol _sscanf referenced in function _jinit_memory_mgr
    ...

    Man beachte bei Variante b, dass Symbole aus allen eingebundenen Libs nicht mehr aufgelöst werden können.

    Additional Library Dependencies Eintrag: "$(BOOST_DIR)\lib" funktioniert bei allen anderen Projekten.

    Vielen Dank für eure Hilfe..



  • EDIT:

    Ich arbeite mit Visual Studio 2008 und Boostlib 1.44.0


  • Mod

    Hast Du /NODEFAULTLIB gesetzt?
    http://msdn.microsoft.com/en-us/library/3tz4da4a(VS.80).aspx

    Schalte die Linker Option /Verbose ein, dann siehst Du wer was wo sucht.

    BTW:
    Wenn eine statische lib A eine externe Bibliothek X (wieder statsiche Lib) benötigt. dann wird diese nicht in A automatsich eingebunden. Da es keinen Linker Vorgang gibt sondern nur der Librarian läuft ist nicht mal eine Angabe der X-Lib nötig.

    Erst wenn die DLL/EXE final gelinkt wird, müssen alle externen Bibliotheken (Libs) angegeben werden.



  • Herzlichen Dank für den Denkanstoß und die Belehrung.

    Dem Liberian des Unterprojekts muss tatsächlich nicht die Library vorgestellt werden.

    In den ausgeschlossenen Libraries war eine, die nun durch die Verwendung der Boost lib benötigt wurde. Ich verstehe noch nicht ganz, warum plötzlich auch andere Libs manche Symbole nicht mehr auflösen konnte. Nichts desto trotz funktioniert das Programm jetzt.

    Danke.


Anmelden zum Antworten