VC2010 will boost libraries nicht da linken, wo ich will



  • Servus,

    ich probiere gerade meine Applikation mal statt mit GCC mit MSVC 2010 zu bauen.
    Mein Problem ist jetzt, dass er boost-libraries linken will, die er nicht braucht. Ich vermute, das hängt mit dem auto-linking von VC++ zusammen.

    Also der Reihe nach: Ich habe zunächst mal die boost-libraries mit vc2010 gebaut und installiert. Die liegen jetzt unter C:\Boost\lib und heißen libboost_system.lib und libboost_thread.lib Also System-Layout, ohne Versions- und Kompiler-tag.

    Dann habe ich im Makefile spezifiziert:

    LINK          = link
    LFLAGS        = /NOLOGO /INCREMENTAL:NO /SUBSYSTEM:CONSOLE /MANIFEST /MANIFESTFILE:"release\testclient.intermediate.manifest"
    LIBS          = /LIBPATH:C:/Boost/lib libboost_system.lib libboost_thread.lib Ws2_32.lib
    

    Wenn ich jetzt nmake laufen lasse, kommt er bis zum Linken, wo er mit einem

    LINK : fatal error LNK1104: cannot open file 'libboost_date_time-vc100-mt-1_43.lib'
    

    aussteigt.

    WTF?? Ich habe nie gesagt, dass ich data_time haben will ! Und woher kommt er auf das dünne Brett, ich hätte die libraries im tagged- statt im system-layout (mit versionsnummer, Kompiler, etc. Namenssuffix).

    Wieso kann dieses Ding nicht das linken, was ich ihm sage?

    Philipp



  • Boost linkt beim MSVC autom. die Dateien. Das steht in den Headern von Boost mit drin. Was dich daran jetzt stört, weißt wohl nur du.
    Evtl. gibt es ein Define das das autom. Linken unterbindet. Mußt du aber mal in die Boost-Doku oder Boost-Mailingliste schauen.


  • Administrator

    PhilippM schrieb:

    WTF?? Ich habe nie gesagt, dass ich data_time haben will !

    Da scheint Boost klüger zu sein als du dank dem automatischen Linken. Boost.Thread zum Beispiel braucht ganz klar laut Dokumentation Boost.DateTime.
    Siehe hier: http://www.boost.org/doc/libs/1_43_0/doc/html/thread/time.html

    Grüssli



  • Na, dann will ich den Thread hier mal auflösen.

    Vorweg; Unter Mac und Linux brauch thread kein date time (die header ja, aber keine lib), und unter Windows offenbar auch nicht.

    Der Trick ist, das man das #pragma für automatisches Linken unterdrücken muss, indem man beim Kompiliperen BOOST_ALL_NO_LIB definiert. Daraufhin ist man wieder beim expliziten linken und der Linker macht tatsächlich das, was man ihm im Makefile sagt.

    Heilige sch****, ich wusste ja das MSVC komisch ist, aber Linken per Präprozessor-Anweisung, wie krank ist das denn? Linken. Mit dem Präprozessor. Geht's noch?


  • Administrator

    PhilippM schrieb:

    Vorweg; Unter Mac und Linux brauch thread kein date time (die header ja, aber keine lib), und unter Windows offenbar auch nicht.

    Doch, doch, braucht es auch. Du müsstest nur eine Funktion verwenden, welche Boost.DateTime verwendet: Zum Beispiel boost::this_thread::sleep . Die Linker sind natürlich schon so klug, dass sie jeweils nur das nehmen, was sie wirklich benötigen.

    PhilippM schrieb:

    Heilige sch****, ich wusste ja das MSVC komisch ist, aber Linken per Präprozessor-Anweisung, wie krank ist das denn? Linken. Mit dem Präprozessor. Geht's noch?

    Wieso nicht? Ich finde das äusserst praktisch, so muss ich mich nicht ständig um alle Abhängigkeiten kümmern. Wie gesagt, der Linker nimmt sowieso nur das, was er benötigt und nicht mehr. Wenn du die DateTime dazulinkst, es aber gar nicht benötigt wird, dann ist davon am Ende auch nichts im endgültigen Programm drin.

    Du bist der Erste den ich kennen lerne, welcher Probleme damit zu haben scheint. Ich frage mich allerdings, ob es auch daran liegen könnte, dass du die Linker und deren Funktionalität nicht gut genug kennst 😉

    Grüssli



  • PhilippM schrieb:

    Heilige sch****, ich wusste ja das MSVC komisch ist, aber Linken per Präprozessor-Anweisung, wie krank ist das denn? Linken. Mit dem Präprozessor. Geht's noch?

    Das hat gar nichts mit dem Präprozessoe zu tun, sondenr mit #pragma Anweisungen im Sourcecode in denen dem Linker gesagt wird, welche Libs benötigt werden.
    Vorteil: Man muss dem Linkerin den Projekteinstellungen nichts sagen, es steht nämlich im Code.
    Dass solche Statements (pragmas) auch per Präprozessor ausgeschaltet werden können ist ja wieder was anderes.

    Ich kann mich Dravere nur anschließen: Das ist praktisch und effektiv!



  • Es wird ja immer über die Komplexität von Software-Entwiclung und auch von C++ gemeckert. Jetzt wird es einem tatsächlich mal vereinfacht (sowohl vom Compiler-Toolset, als auch von einer Library), und dann ist es auch nicht richtig.

    Meiner Meinung nach sollten viel mehr Libraries und Compiler-Toolsets diese pragma-Anweisungen für den Linker umsetzen. Das würde so manche Anfänger entlasten. Aber auch Profis würden entlastet werden, immer und immer wieder in jedem neuen Projekt die Konfiguration anzupassen.

    Ich finde das hilfreich was Boost da automatisch macht.


Anmelden zum Antworten