VC++ findet Boost - Include nicht
-
Hi,
sorry fuer die wahrscheinlich bloede Frage, aber das Visual Studio & Entwicklung unter Windows ist voelliges Neuland fuer mich :Ich habe eine Anwendung unter Linux fertig entwickelt, die auch unter Windows laufen soll. Habe also soeben frisch Visual Studio 2005 Express installiert und auch die vorkompilierte Boost-Lib gemaess Anleitung in http://www.boost.org/doc/libs/1_35_0/more/getting_started/windows.html#get-boost
, wo steht:The easiest way to get a copy of Boost is to use the installer provided by Boost Consulting. We especially recommend this method if you use Microsoft Visual Studio .NET 2003 or Microsoft Visual Studio 2005, because the installer can download and install precompiled library binaries, saving you the trouble of building them yourself.
Die Boost-Installation verlief OK.
Im Programm habe ein
#include <boost\program_options\detail\utf8_codecvt_facet.hpp>Nun bekomme ich aber vom VC++ die Fehlermeldung
E:\IT\...: fatal error C1083: cannot open include file: 'boost\program_options\detail\utf8_codecvt_facet.hpp': No such file or directory
Was muss ich wo in Visual Studio eintragen, damit der Compiler (und vermutlich spaeter auch der Linker) die boost-libs findet ???
(Das Boost-DirectoryDie ist in der PATH Variable eingetragen ).
Danke fuer Eure Hilfe
-
Projekt -> Eigenschaften -> Konfigurationseinstellungen -> C/C++ -> Zusätzliche Includeverzeichnisse
Da das Verzeichnis angeben, wo die Boost-Files liegen.
-
Machine schrieb:
Projekt -> Eigenschaften -> Konfigurationseinstellungen -> C/C++ -> Zusätzliche Includeverzeichnisse
Da das Verzeichnis angeben, wo die Boost-Files liegen.
Zur Vereinfachung kann eine Systemvariable interessant sein (Ich habe Boost persönlich auch nicht in der PATH-Variable abgelegt), bei mir lautet diese BoostDir, und unter den Projekteinstellungen habe ich folgende beiden Änderungen gemacht:
a) Zusätzliche Includeverzeichnisse: $(BoostDir)\
b) Zusätzliche Lib-Verzeichnisse: $(BoostDir)\lib
(Bei mir liegen die lib/dll von Boost in einen Unterverzeichnis lib unterhalb
von boost.cu André
-
Oder:
Extras => Optionen => Projekte und Projektmappen => VC++ Verzeichnisse (in der Listbox rechts oben Includedateien auswählen)
Dann gilt der Pfad für alle Projekte.
-
Danke fuer die Antwort, aber bei mir gibt es in dem gesamten Zweig Projekt -> Eigenschaften -> Konfigurationseinstellungen -> C/C++ kein Eintrag, der "Zusätzliche Includeverzeichnisse " heisst ...
Boese Vermutung: Ich verwende die Express Edition: Ist es dort vielleicht "disabled" ??? ( Wie ich MS kenne, wuerde mich das nicht ueberraschen ...)
-
@matze: Deine "globale" Loesung hat funktioniert!
Jetzt meldet sich der Linker, dass er die entsprechende lib nicht findet ... ich schaue aber zuerst selber, wenn ich's nicht zusammenbringe, melde mich wieder
-
Ich habe analog zu _matzes's Loesung auch das Directory fuer den Linker eingetragen, also Extras => Optionen => Projekte und Projektmappen => VC++ Verzeichnisse (in der Listbox rechts oben Bibliotheksdateien auswählen).
So weit so gut. ABER: ich bekomme die Meldung
LINK : fatal error LNK1104: cannot open file 'libboost_program_options-vc80-mt-gd-1_34_1.lib'
Ist ja auch kein Wunder, ich habe nachgeschaut in dem lib-Directory, die Datei heisst 'boost_program_options-vc80-mt-gd-1_34_1.lib' ...
Hat jemand eine Idee, wie ich das korrigieren koennte ???
-
irgendwo nen \ vergessen...
müsste afaik
lib\boost_program_options-vc80-mt-gd-1_34_1.lib
sein..
-
Diogenes77 schrieb:
Danke fuer die Antwort, aber bei mir gibt es in dem gesamten Zweig Projekt -> Eigenschaften -> Konfigurationseinstellungen -> C/C++ kein Eintrag, der "Zusätzliche Includeverzeichnisse " heisst ...
Boese Vermutung: Ich verwende die Express Edition: Ist es dort vielleicht "disabled" ??? ( Wie ich MS kenne, wuerde mich das nicht ueberraschen ...)
Doch, unter C/C++ => Allgemein. Guck mal nach rechts (erster Eintrag). Oder fehlt das wirklich?
-
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.