boost in VS2005



  • Hallo Leute,

    weiß nicht ob ich hiermit an der richtigen Addresse bin, aber ich habe folgende Problem:
    Ich wollte Geh-Versuche mit boost ( http://www.boost.org ) machen.

    Leider bringt er mir nach erfolgreicher kompilierung eines Programmes mit boost bibliotheken (z.B. http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/tutorial.html#simplecase) folgende Meldung:
    "The System can not execute the specified program." 😮

    Zum Hintergrund: Das scheint hiermit irgendwie im zusammenhang zustehen:
    Habe Visual Studio 2005 Pro auf einem 32bit WinXP zu laufen.
    Die Maschine selbst verfügt über 4GB ram (wobei dann hier nur 3,48GB angesprochen werden können).

    Beim rumgooglen auf einen artikel gestoßen, in dem stand, dass bei 4GB maschinen mit 32bit win nur 2GB den Programmen zu verfügung gestellt werden, der rest dem System vorbehalten bleibt. (Leider hab ich den link nichtmehr parat).

    Weiß jmd was da los ist?
    Viele Grüße,
    Jan.

    Nachtrag: Hier ein solcher link:
    http://www.administrator.de/mit_Windows_XP_(32bit)_bis_zu_3GB_RAM_für_Software_nutzen_(3GB_Switch).html
    Finded man ja doch mehrmals...



  • Klingt eher nach einem Fehler in den Projekteinstellungen.. kompilierst Du vieleicht für 64-bit Prozessoren oder ein anderes Betriebssystem? Ein Speicherproblem kann ich mir nur schwer vosrstellen.



  • Hi,

    kompilierst Du vieleicht für 64-bit Prozessoren oder ein anderes Betriebssystem?

    Weder noch. Defaulteinstellungen -> Win32
    Einfach
    Project->New->Win32 Console Application
    ->Empty Project

    Anbei meine vcproj:

    <?xml version="1.0" encoding="Windows-1252"?>
    <VisualStudioProject
    	ProjectType="Visual C++"
    	Version="8,00"
    	Name="boost_serialisation"
    	ProjectGUID="{59D812C1-B6BB-4B85-98D3-93B2B4991557}"
    	RootNamespace="boost_serialisation"
    	Keyword="Win32Proj"
    	>
    	<Platforms>
    		<Platform
    			Name="Win32"
    		/>
    	</Platforms>
    	<ToolFiles>
    	</ToolFiles>
    	<Configurations>
    		<Configuration
    			Name="Debug|Win32"
    			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
    			IntermediateDirectory="$(ConfigurationName)"
    			ConfigurationType="1"
    			CharacterSet="1"
    			>
    			<Tool
    				Name="VCPreBuildEventTool"
    			/>
    			<Tool
    				Name="VCCustomBuildTool"
    			/>
    			<Tool
    				Name="VCXMLDataGeneratorTool"
    			/>
    			<Tool
    				Name="VCWebServiceProxyGeneratorTool"
    			/>
    			<Tool
    				Name="VCMIDLTool"
    			/>
    			<Tool
    				Name="VCCLCompilerTool"
    				Optimization="0"
    				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
    				MinimalRebuild="true"
    				BasicRuntimeChecks="3"
    				RuntimeLibrary="3"
    				UsePrecompiledHeader="0"
    				WarningLevel="3"
    				Detect64BitPortabilityProblems="true"
    				DebugInformationFormat="4"
    			/>
    			<Tool
    				Name="VCManagedResourceCompilerTool"
    			/>
    			<Tool
    				Name="VCResourceCompilerTool"
    			/>
    			<Tool
    				Name="VCPreLinkEventTool"
    			/>
    			<Tool
    				Name="VCLinkerTool"
    				LinkLibraryDependencies="true"
    				LinkIncremental="2"
    				GenerateDebugInformation="true"
    				SubSystem="1"
    				TargetMachine="1"
    			/>
    			<Tool
    				Name="VCALinkTool"
    			/>
    			<Tool
    				Name="VCManifestTool"
    			/>
    			<Tool
    				Name="VCXDCMakeTool"
    			/>
    			<Tool
    				Name="VCBscMakeTool"
    			/>
    			<Tool
    				Name="VCFxCopTool"
    			/>
    			<Tool
    				Name="VCAppVerifierTool"
    			/>
    			<Tool
    				Name="VCWebDeploymentTool"
    			/>
    			<Tool
    				Name="VCPostBuildEventTool"
    			/>
    		</Configuration>
    		<Configuration
    			Name="Release|Win32"
    			OutputDirectory="$(SolutionDir)$(ConfigurationName)"
    			IntermediateDirectory="$(ConfigurationName)"
    			ConfigurationType="1"
    			CharacterSet="1"
    			WholeProgramOptimization="1"
    			>
    			<Tool
    				Name="VCPreBuildEventTool"
    			/>
    			<Tool
    				Name="VCCustomBuildTool"
    			/>
    			<Tool
    				Name="VCXMLDataGeneratorTool"
    			/>
    			<Tool
    				Name="VCWebServiceProxyGeneratorTool"
    			/>
    			<Tool
    				Name="VCMIDLTool"
    			/>
    			<Tool
    				Name="VCCLCompilerTool"
    				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
    				RuntimeLibrary="2"
    				UsePrecompiledHeader="0"
    				WarningLevel="3"
    				Detect64BitPortabilityProblems="true"
    				DebugInformationFormat="3"
    			/>
    			<Tool
    				Name="VCManagedResourceCompilerTool"
    			/>
    			<Tool
    				Name="VCResourceCompilerTool"
    			/>
    			<Tool
    				Name="VCPreLinkEventTool"
    			/>
    			<Tool
    				Name="VCLinkerTool"
    				LinkIncremental="1"
    				GenerateDebugInformation="true"
    				SubSystem="1"
    				OptimizeReferences="2"
    				EnableCOMDATFolding="2"
    				TargetMachine="1"
    			/>
    			<Tool
    				Name="VCALinkTool"
    			/>
    			<Tool
    				Name="VCManifestTool"
    			/>
    			<Tool
    				Name="VCXDCMakeTool"
    			/>
    			<Tool
    				Name="VCBscMakeTool"
    			/>
    			<Tool
    				Name="VCFxCopTool"
    			/>
    			<Tool
    				Name="VCAppVerifierTool"
    			/>
    			<Tool
    				Name="VCWebDeploymentTool"
    			/>
    			<Tool
    				Name="VCPostBuildEventTool"
    			/>
    		</Configuration>
    	</Configurations>
    	<References>
    	</References>
    	<Files>
    		<Filter
    			Name="Source Files"
    			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
    			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
    			>
    			<File
    				RelativePath=".\main.cpp"
    				>
    			</File>
    		</Filter>
    		<Filter
    			Name="Header Files"
    			Filter="h;hpp;hxx;hm;inl;inc;xsd"
    			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
    			>
    		</Filter>
    		<Filter
    			Name="Resource Files"
    			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
    			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
    			>
    		</Filter>
    	</Files>
    	<Globals>
    	</Globals>
    </VisualStudioProject>
    

    (Btw, bin neu in dem forum hier. Kann ich auch dateien als anhang machen?)

    Ja, ein Speicherproblem kann man außschließen. Habs auf meinem alten rechner probiert (32bit, 2gb ram) und gleiches problem.
    Das Code-Bsp von "getting started" (http://www.boost.org/doc/libs/1_42_0/more/getting_started/windows.html) klappt allerdings. Weitere Tutorial-Bsps allerdings nicht. (Wie besagtes http://www.boost.org/doc/libs/1_42_0/libs/serialization/doc/tutorial.html#simplecase)

    Hoffe jmd kennt das Porblem.



  • Okay!?

    Problem gelöst:
    http://stackoverflow.com/questions/37398/how-do-i-make-a-fully-statically-linked-exe-with-visual-studio-express-2005

    For the C-runtime go to the project settings, choose C/C++ then 'Code Generation'. Change the 'runtime library' setting to 'multithreaded' instead of 'multithreaded dll'.

    Somit ist das problem gelöst. So recht verstanden hab ich es aber nicht.
    Hat jmd eine kurze und einleuchtende Erklärung (z.b. guten Link) was der Unterschied von Runtime Library = Multi-threaded (/MT) und Runtime Library = Multi-threaded DLL (/MD) parat?

    Wenn nicht, trotzdem danke connan dass du dich dem angenommen hast!



  • Visual C++ bringt, wie jeder andere C++ Compiler, eine sogenannte Runtime-Library mit. Da drinnen sind diverse Dinge implementiert wie die ganzen IO Funktionen, Speicherverwaltung, Hilfsfunktionen für Dinge wie dynamic_cast etc.

    Diese Library gab es bei MSVC einst in 6 Versionen
    * Singlethreaded Release (statische LIB)
    * Singlethreaded Debug (statische LIB)
    * Multithreaded Release (statische LIB)
    * Multithreaded Debug (statische LIB)
    * Multithreaded Release DLL
    * Multithreaded Debug DLL

    In neueren MSVC Versionen wurden dann die beiden "singlethreaded" Varianten entfernt, es bleiben also nur noch 4 Versionen. Der Name, also das "multithreaded" im Namen, wurde aber beibehalten.

    Der Unterschied zwischen den "singlethreaded" und "multithreaded" Versionen ist, dass die "singlethreaded" Versionen nicht damit klar kommen, wenn man bestimmte Funktionen (z.B. malloc, operator new, ...) aus mehreren Threads gleichzeitig aufruft. Dafür sind sie ein klein wenig schneller. Da das aber eine - eigentlich unnötige - Fehlerquelle darstellt, wurden die auch entfernt.

    Der Unterschied zwischen den LIB und den DLL Versionen ist, dass die LIB Version direkt zu deinem Programm dazugelinkt wird - der gesamte Code. Das Programm ("die .exe") wird dadurch um einiges grösser. Bei der DLL Version wird nur ein Verweis auf die DLL zum Programm dazugelinkt, dadurch bleibt "die .exe" kleiner. Dafür benötigt man aber auf jedem Computer wo man das Programm ausführen möchte die passende DLL. Und die wird mit Windows nicht mitgeliefert. Das wiederum ist der Vorteil der LIB Variante, denn da werden keine extra DLLs benötigt. Angenehmer für den User, er muss nicht extra nochwas installieren.

    Der Unterschied zwischen den Debug und Release Varianten ist dir hoffentlich klar 🙂

    Dass es mit "LIB" Runtime bei dir funktioniert, und mit "DLL" Runtime nicht, liegt aber nicht an der Runtime selbst (bzw. dem Fehler der DLL), denn die Runtime DLLs werden alle mit Visual Studio mit installiert. Auf dem eigenen Rechner, wo Visual Studio installiert ist, geht also üblicherweise immer alles.

    ----

    Nun verwenden die Boost Libraries allerdings ein schlaues System namens Auto-Linking, wobei die benötigten Boost Libraries automatisch zu deinem Programm dazugelinkt werden, wenn du die diversen Boost Headers inkludierst. Dadurch muss man nicht umständlich in den Projekteinstellungen jede verwendete Boost Library einstellen.
    Dabei wählen die Boost Headers auch immer die LIB bzw. DLL Version der Boost Libraries aus, je nachdem, ob du die LIB Runtime oder DLL Runtime verwendest.

    Als du noch die DLL Runtime eingestellt hattest, wurde dein Programm also auch gegen die Boost DLLs gelinkt. D.h. es braucht zum Laufen auch die Boost DLL Files.

    Nun hast du die Boost Libraries zwar alle kompiliert, und anscheinend auch die DLL Versionen - sonst hättest du dein Programm gar nicht linken können. D.h. die Boost DLLs müssen auf deinem System vorhanden sein. Allerdings hast du die Boost DLLs vermutlich nirgends hin kopiert, wo Windows sie finden würde.

    Probier mal die Runtime wieder auf DLL zurückzuschalten, und kopier dann alle Boost DLLs in das selbe Verzeichnis wo auch "die .exe" von deinem Programm liegt. Dann müsste sich das schon starten lassen. Allerdings nur wenn du meine Theorie überprüfen möchtest.

    Ich würde dir nämlich empfehlen trotzdem weiterhin die LIB Runtime zu verwenden, denn dann läuft dein Programm wie schon gesagt auch auf anderen Rechnern, wo Visual Studio nicht installiert ist. Ohne dass man dafür extra die Visual Studio Runtime nachinstallieren müsste (die gibt's nämlich netterweise gratis von MS zum runterladen, also zum Laufen bekommt man die Programme immer, aber ist halt lästiger).



  • Vielen Dank hustbaer für deine ausführliche Antwort!

    hustbaer schrieb:

    Nun hast du die Boost Libraries zwar alle kompiliert, und anscheinend auch die DLL Versionen - sonst hättest du dein Programm gar nicht linken können. D.h. die Boost DLLs müssen auf deinem System vorhanden sein. Allerdings hast du die Boost DLLs vermutlich nirgends hin kopiert, wo Windows sie finden würde.

    Probier mal die Runtime wieder auf DLL zurückzuschalten, und kopier dann alle Boost DLLs in das selbe Verzeichnis wo auch "die .exe" von deinem Programm liegt. Dann müsste sich das schon starten lassen.

    Da sollte es doch eigendlich reichen die PATH variable auf %boost_root%/lib zu setzen, damit das System die dll's bzw lib's finden kann.
    Wie auch immer, beide Varianten (setzen von PATH-Var und kopieren der benötigten dlls bringt kein erfolg)

    Viele Grüße,
    Jan



  • Guck mal mit www.dependencywalker.com ob ihm noch DLLs abgehen.



  • Hi hustbaer,

    erstmal vielen Dank für den Tip mit dependencywalker. Kannte das Tool noch nicht und scheint echt nützlich zu sein!

    Das Problem liegt darin, dass er MSVCP80.DLL nicht finden kann.
    Diese liegt bei mir unter
    C:\Programme\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT

    Kopieren der dll's in Ordner der exe oder angeben des Pfades in PATH bringt nichts!?

    Ich weiß, diese Sachen findet man zu haufe über google, aber eben mit der obigen Beschreibung.
    Stell ich mich einfach zu dumm an?



  • Nur um das klarzustellen: geht das Programm auch auf der Windows Installation nicht, wo es compiliert wurde? Oder nur nicht auf anderen PC/Installationen?

    Wenn letzteres ist die Lösung einfach: lade das Redistributable Pack runter, und installier es auf dem anderen PC. Und natürlich muss das Programm als Release compiliert sein, denn die Debug DLLs sind nicht im Redistributable Pack enthalten.

    Wenn es auch dort wo Visual Studio installiert ist nicht geht, weiss ich nicht woran es liegen kann. Hatte ich noch nie.

    Ansonsten hilft wie du ja schon festgestellt hast das Verwenden der "statischen Runtime" (LIB statt DLL).


Anmelden zum Antworten