VC++ findet Boost - Include nicht
-
Neee, hab's nochmals geprueft, als Pfad ist korrekt eingetragen C:\Program Files\boost\boost_1_34_1\lib. Und das File dort heisst
boost_program_options-vc80-mt-gd-1_34_1.libUnd wenn ich es versuchshalber umbenenne in libboost_program_options-vc80-mt-gd-1_34_1.lib, findet es der Linker und meldet success ...
-
Doch, unter C/C++ => Allgemein. Guck mal nach rechts (erster Eintrag). Oder fehlt das wirklich?
Sorry, Du hast recht, ich habe mich vorhin verschaut ...
-
Also, das hier beschriebene Problem besteht, ich kann noch immer nicht linken:
Neee, hab's nochmals geprueft, als Pfad ist korrekt eingetragen C:\Program Files\boost\boost_1_34_1\lib. Und das File dort heisst
boost_program_options-vc80-mt-gd-1_34_1.libUnd wenn ich es versuchshalber umbenenne in libboost_program_options-vc80-mt-gd-1_34_1.lib, findet es der Linker und meldet success ...
Zusatz: In der boost - Getting-Started-Doku steht:
In order to choose the right binary for your build configuration you need to know how Boost binaries are named. Each library filename is composed of a common sequence of elements that describe how it was built. For example, libboost_regex-vc71-mt-d-1_34.lib can be broken down into the following elements:
lib Prefix: except on Microsoft Windows, every Boost library name begins with this string. On Windows, only ordinary static libraries use the lib prefix; import libraries and DLLs do not.6
Und in der Fussnote 6 steht:
[6] This convention distinguishes the static version of a Boost library from the import library for an identically-configured Boost DLL, which would otherwise have the same name.
Ich vermute, irgendwo hier liegt der Hund begraben ...
(Bei mir heissen aber ALLE libraries boost*.*, OHNE diesen lib-Praefix. )Bitte jene unter Euch, die boost && VC++ verwenden, schaut nach, wie Eure Einstellungen sind. Ich bin mit dem Projekt schon sehr unter Zeitdruck ... Und es kann nicht die Loesung sein, dass ich jetzt haendisch alle .lib - Files in lib.lib umbenenne ...

-
Mach mal in den Linker-Einstellungen (wo dein Lib-Pfad steht) hinter den Pfad (am besten hinter alle Pfade, die da stehen) einen doppelten Backslash (\).
Also z.B.: C:\Program Files\boost\boost_1_34_1\lib\\
-
Hast du boost evtl. mit falschen Einstellungen erstellt?
Ich benutze VC2005 und bei mir gibt es interessanter weise beide Versionen. Einmalboost*vc80*.lib
und
libboost*vc80*.libKann 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 istfatal 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.dllvorhanden.
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.