VC++ findet Boost - Include nicht



  • Hast du boost evtl. mit falschen Einstellungen erstellt?
    Ich benutze VC2005 und bei mir gibt es interessanter weise beide Versionen. Einmal

    boost*vc80*.lib
    und
    libboost*vc80*.lib

    Kann aber daher kommen, weil ich anfangs viel rumgespielt habe.

    Was kriegst du denn für eine Fehlermeldung vom Linker?



  • Für gewöhnlich werden beide Varianten gebaut. Zumindest für die meisten Libs. Kommt darauf an, ob man dynamisch oder statisch linkt (und somit auch, welche CRT man benutzt).



  • //EDIT: Sorry, vorzeitig auf Absenden gedrueckt, daher loesche ich das



  • Danke fuer die Antworten.

    Also ich fasse das Problem zusammen:
    Die Linker-Fehlermeldung ist

    fatal error LNK11004: cannot open file 'libboost_program_options-vc80-mt-gd-1_34_1.lib'

    Das Setting in Visual Studio unter 'Extras -> Optionen -> Projekte und Projektmappen -> VC++ Verzeichnisse' ist

    C:\Program Files\boost\boost_1_34_1\lib\

    Dort sind die Files

    boost_program_options-vc80-mt-gd-1_34_1.lib
    boost_program_options-vc80-mt-gd-1_34_1.dll

    vorhanden.

    Wenn ich nun das File 'boost_program_options-vc80-mt-gd-1_34_1.lib' zu 'libboost_program_options-vc80-mt-gd-1_34_1.lib' kopiere, linkt das Programm. Das bedeutet, die VC++ Settings als Fehlerquelle auszuschliessen sind, der Linker sucht im richtigen Verzeichniss.

    Neue Idee, was das Problem sein koennte: Ich habe im Installer (Download unter http://www.boost-consulting.com/products/free) die "falsche" Variante gewaehlt. (= Multithread Debug DLL) und die enthaelt die geforderte statische Lib einfach nicht. S. auch Zitat aus Boost-Doku:

    On Windows, only ordinary static libraries use the lib prefix; import libraries and DLLs do not.

    Ich will aber eh lieber dynamisch linken. D.h. die (hoffentlich letzte) Frage lautet:

    Wie sage ich's dem VC++ 2005, dass nicht statisch, sondern dynamisch gelinkt werden soll ???



  • Wo genau ist nun dein Problem? 🙂
    Scheint doch alles zu passen...?

    boost_program_options-vc80-mt-gd-1_34_1.lib ist für das dynamische linken gegen boost_program_options-vc80-mt-gd-1_34_1.dll.

    Du musst anders als beim gcc den Lib-Namen extakt angeben. Also boost_program_options-vc80-mt-gd-1_34_1.lib eintragen (er wird nicht versuchen ein lib und ein .a hinzuzufügen, wie der gcc z.B.).

    Probier doch mal aus, wenn du die DLL aus dem Verzeichnis rausnimmst und dann die exe startest. Da sollte ne Fehlermeldung kommen.

    Du musst schon aufpassen, dass wenn du deine Anwendung als Multithreaded-Debug übersetzt, muss auch die DLL mit der selben Einstellung übersetzt werden.

    Oder seh ich das falsch?



  • Vielleicht habe ich nur ein Verstaendnis-Problem:

    Du musst anders als beim gcc den Lib-Namen extakt angeben. Also boost_program_options-vc80-mt-gd-1_34_1.lib eintragen (er wird nicht versuchen ein lib und ein .a hinzuzufügen, wie der gcc z.B.).

    Wo gebe ich den lib-Namen ein?? (Ich habe bisher ihn nirgends eingegeben Ich habe nur die Pfade zu den Include- und den Bibliotheken im VC++ ergaenzt).

    Du musst schon aufpassen, dass wenn du deine Anwendung als Multithreaded-Debug übersetzt, muss auch die DLL mit der selben Einstellung übersetzt werden.

    Wo gebe ich es in VC++ ein, ob ich die App als Multi/Single-threaded- Debug uebersetzen will ??



  • Nachtrag: Das ist mein 1. groesseres Projekt mit C++, wo ich mit Bibliotheken arbeite. Und ich merke, dass ich beim Thema "Wie compilieren und wie linken und gegen welche wie uebersetzte Libs?" nicht sattelfest bin. Kannst Du mir irgendein Tutorial/Quelle nennen, wo ich das beheben kann ???

    Danke fuer Eure Hilfe!! Ich muss jetzt weg, bin morgen wieder online.



  • Bei Boost + MSVC muss man keine Libraries angeben. Das machen die Boost-Headers selber über ein Pragma. Es reicht wenn das LIB-Verzeichnis bekannt ist.

    Schalte deine Runtime auf DLL und alles wird (wenn möglich) auf Boost-DLLs gelinkt. Von manchen Libs gibts keine DLLs, also immer nur statisch. Ich habe beim Linken nie Probleme gehabt. Voraussetzung ist natürlich, das alle LIBs korrekt und vollständig gebaut wurden. Der Rest geht automatisch.



  • @Harrie: Das war die Loesung ! Jetzt funzt es !! 👍
    Danke an alle, wieder was gelernt ... 🙂



  • Du kannst aber auch einfach die statischen libs erstellen. Du musst nur bei bjam als zusätzlichen Parameter --build-type=complete angeben, dann werden auch die libboost*.lib erstellt.


Anmelden zum Antworten