4

Ich untersuche die Verwendung von SCons für unseren Build-Prozess, während wir C++ für mehrere Plattformen entwickeln. Ich bin 99% des Weges dort in der Build-Konfiguration, aber ich bin in eine VERY seltsamen Fehler in Windows mit der vorkompilierten Header-Datei zu tun. Noch seltsamer ist, dass es nur bei einem Projekt passiert.SCons, Boost :: ASIO, vorkompilierte Windows-Header und Linker-Fehler

In der SConscript Datei für dieses Projekt, ich habe nach dem die PCH auf Windows zu kompilieren:

if env['PLATFORM'] == 'win32': 
    env['PCH'] = env.PCH('MyPCH-LSCommon.pch', 'Common/src/MyPCH.h')[0] 
    env['PCHSTOP'] = '"MyPCH.h"' 

Ich habe auch einen Compiler-Flag müssen MyPCH.h im Projekt auf alle Dateien umfassen zu erzwingen:

if env['PLATFORM'] == 'win32': 
    cxxflags = [ '/FI"MyPCH.h"' ] 

Alles läuft und kompiliert absolut gut. Es ist nicht bis zur endgültigen DLL-Verknüpfungsstufe, dass ich Seiten und Seiten von Linker-Fehler erhalten, wie die folgenden:

error LNK2001: unresolved external symbol "private: static class 
boost::asio::detail::tss_ptr<class boost::asio::detail::call_stack<class 
boost::asio::detail::win_iocp_io_service>::context> boost::asio::detail::call_stack<class 
boost::asio::detail::win_iocp_io_service>::top_" 
([email protected][email protected][email protected]@[email protected]@@@[email protected]@[email protected]@[email protected] 
[email protected][email protected][email protected]@[email protected]@@@[email protected]@[email protected]@@[email protected]) 

und:

 error LNK2001: unresolved external symbol "private: static class 
boost::asio::detail::winsock_init<2,0> boost::asio::detail::winsock_init<2,0>::instance_" 
([email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]) 

Dies ist verwirrend, weil keiner der Klassen, die ich Link-Warnungen von bekommen boost :: asio nicht einmal verwenden, obwohl es in der vorkompilierten Header-Datei enthalten ist und die Kette in einigen # includes.

Noch verwirrender ist, dass, wenn ich die Kompilierung der vorkompilierten Header-Datei deaktivieren, aber immer noch zwingen, es ist, alles kompiliert und verbindet einfach gut. Es dauert nur für immer verdammt.

Hat jemand eine Ahnung, was könnte diese Linker Fehler verursachen?

Vielen Dank im Voraus.

--- EDIT ---

Hier ist die Befehlszeile, die SCons wird die PCH für den Aufbau auszuspucken (Minus Include Paths):

cl /nologo /W4 /Od /RTC1 /MDd /TP /EHsc /FD /RTC1 /RTCc /Gy /openmp /TP 
/Fd"\vc80.pdb" /nologo /Wp64 /wd4231 /wd4616 /errorReport:prompt /Zm256 /MDd /Od 
/FI"CedrusPCH.h" /DOS_WINDOWS=OS_WINDOWS /D_WIN32 /DWIN32 /D_WIN32_WINNT=0X500 /D_WINDOWS 
/D_UNICODE /DBOOST_ALL_DYN_LINK /DBOOST_REGEX_DYN_LINK /DBOOST_LIB_DIAGNOSTIC 
/D_VC80_UPGRADE=0x710 /DUNICODE /DWXUSINGDLL /DwxUSE_SERVICE_DISCOVERY=1 /D_DEBUG /D_DEBUG 
/DSL_ENABLE_NETWORKING=1 /DWXMAKINGDLL_LSCOMMON /DSLSDK_USEDLL 
/c C:\Projects\licenser\Common\src\CedrusPCH.h /Foscons-out\dbg\obj\CedrusPCH-LSCommon.obj 
/Yc"CedrusPCH.h" /Fpscons-out\dbg\obj\CedrusPCH-LSCommon.pch /ZI CedrusPCH.h 

Hier ist die Befehlszeile für einen kompilierten Datei (wieder minus umfassen Pfade):

cl /Foscons-out\dbg\obj\Licenser\src\secure\windows_crypto 
\PlatformCryptoKeyProvider_wincrypt.obj /c C:\Projects\licenser\Licenser\src\secure 
\windows_crypto\PlatformCryptoKeyProvider_wincrypt.cpp /nologo /W4 /Od /RTC1 /MDd /TP 
/EHsc /FD /RTC1 /RTCc /Gy /openmp /TP /Fd"\vc80.pdb" /nologo /Wp64 /wd4231 /wd4616 
/errorReport:prompt /Zm256 /MDd /Od /FI"CedrusPCH.h" /nologo /W4 /Od /RTC1 /MDd 
/DOS_WINDOWS=OS_WINDOWS /D_WIN32 /DWIN32 /D_WIN32_WINNT=0X500 /D_WINDOWS /D_UNICODE 
/DBOOST_ALL_DYN_LINK /DBOOST_REGEX_DYN_LINK /DBOOST_LIB_DIAGNOSTIC /D_VC80_UPGRADE=0x710 
/DUNICODE /DWXUSINGDLL /DwxUSE_SERVICE_DISCOVERY=1 /D_DEBUG /D_DEBUG 
/DSL_ENABLE_NETWORKING=1 /DWXMAKINGDLL_LSCOMMON /DSLSDK_USEDLL /D_USRDLL /D_WINDLL 
/Yu"CedrusPCH.h" /Fpscons-out\dbg\obj\CedrusPCH-LSCommon.pch /ZI 
PlatformCryptoKeyProvider_wincrypt.cpp 

Und schließlich ist hier die Link-Befehlszeile:

link /nologo /MACHINE:X86 /DEBUG -manifest /dll /out:scons-out\dbg\obj\LSCommon.dll 
/implib:scons-out\dbg\obj\LSCommon.lib /LIBPATH:scons-out\dbg\lib 
/LIBPATH:C:\Projects\licenser\scons-out\dbg\lib /LIBPATH:scons-out\dbg\obj 
/LIBPATH:. /LIBPATH:C:\Projects\licenser /LIBPATH:C:\Projects\licenser\scons-out\dbg\obj 
/LIBPATH:C:\Projects\wxWidgets\lib\vc_dll_vc8 /LIBPATH:C:\Projects\boost\install\lib 
"/LIBPATH:C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Lib" 
"/LIBPATH:C:\Program Files\Bonjour SDK\lib\win32" unicows.lib winmm.lib comctl32.lib 
rpcrt4.lib ws2_32.lib oleacc.lib kernel32.lib user32.lib gdi32.lib winspool.lib 
comdlg32.lib advapi32.lib shell32.lib oleacc.lib ole32.lib oleaut32.lib uuid.lib 
odbc32.lib odbccp32.lib boost_signals-vc80-mt-gd-1_39.lib boost_system-vc80-mt-gd-1_39.lib 
boost_date_time-vc80-mt-gd-1_39.lib boost_regex-vc80-mt-gd-1_39.lib 
boost_wserialization-vc80-mt-gd-1_39.lib boost_serialization-vc80-mt-gd-1_39.lib 
boost_thread-vc80-mt-gd-1_39.lib wxbase28ud.lib wxbase28ud_net.lib wxbase28ud_xml.lib 
wxmsw28ud_adv.lib wxmsw28ud_aui.lib wxmsw28ud_core.lib wxmsw28ud_html.lib wxmsw28ud_qa.lib 
wxmsw28ud_richtext.lib wxmsw28ud_xrc.lib LSBase.lib disphelper.lib Crypt32.lib 
/PDB:scons-out\dbg\obj\LSCommon.pdb /DEBUG 
scons-out\dbg\obj\Licenser\src\dll_template_instantiation_export_LSCommon.obj 
scons-out\dbg\obj\Licenser\src\secure\ConcreteMessageSigningAlgorithm_DSA_with_SHA1.obj 
scons-out\dbg\obj\Licenser\src\secure\CryptoObjectFactory.obj 
scons-out\dbg\obj\Licenser\src\secure\EntropyCalculation.obj 
scons-out\dbg\obj\Licenser\src\data\LSAccount.obj 
scons-out\dbg\obj\Licenser\src\data\LSAccountHistory.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSAccountHistoryRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSAccountRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\data\LSActivation.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSActivationRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\data\LSBlob.obj 
scons-out\dbg\obj\Licenser\src\data\LSCompositePrimaryKey.obj 
scons-out\dbg\obj\Licenser\src\data\LSDatabaseElementBase.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSDoActivateReplyPacket.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSDoActivateRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSDoManualActivateReplyPacket.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSDoManualActivateRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\data\LSLicense.obj 
scons-out\dbg\obj\Licenser\src\data\LSLicenseHistory.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSLicenseHistoryRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSLicenseRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSLoginReplyPacket.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSLoginRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\data\LSMachine.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSMachineRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSNet.obj 
scons-out\dbg\obj\Licenser\src\data\LSPhyActivation.obj 
scons-out\dbg\obj\Licenser\src\data\deprecated_streamables\LSPhyActivation_LegacyStreamingHelper.obj 
scons-out\dbg\obj\Licenser\src\data\LSPrimaryKey.obj 
scons-out\dbg\obj\Licenser\src\data\LSPrimaryKeyDefinitions.obj 
scons-out\dbg\obj\Licenser\src\data\LSProduct.obj 
scons-out\dbg\obj\Licenser\src\data\LSProductHistory.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSProductHistoryRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSProductRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\data\LSSimplePrimaryKey.obj 
scons-out\dbg\obj\Licenser\src\data\LSUser.obj 
scons-out\dbg\obj\Licenser\src\data\LSUserHistory.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSUserHistoryRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSUserRequestPacket.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\streaming_versioning\StreamableClassInfoVersionTranslator.obj 
scons-out\dbg\obj\Licenser\src\data\deprecated_streamables\LSProduct_deprecated_v_2.obj 
scons-out\dbg\obj\Licenser\src\secure\deprecated_streamables\DSA.obj 
scons-out\dbg\obj\Licenser\src\secure\deprecated_streamables\DSAKeyPair.obj 
scons-out\dbg\obj\Licenser\src\secure\deprecated_streamables\DSAPublicKey.obj 
scons-out\dbg\obj\Licenser\src\secure\deprecated_streamables\Hash.obj 
scons-out\dbg\obj\Licenser\src\secure\deprecated_streamables\SHA1.obj 
scons-out\dbg\obj\Licenser\src\server_daemon\LSActivationApprovalStrategy.obj 
scons-out\dbg\obj\Licenser\src\data\LSDatabaseElementT.obj 
scons-out\dbg\obj\Licenser\src\data\LSPairPrimaryKeyT.obj 
scons-out\dbg\obj\Licenser\src\data\LSSimplePrimaryKeyT.obj 
scons-out\dbg\obj\Licenser\src\secure\windows_crypto\PlatformCryptoKeyProvider_wincrypt.obj 
scons-out\dbg\obj\Licenser\src\secure\windows_crypto\Scoped_RAII_AutoReleaseWincryptHandleFactory.obj 

Auch der PCH-Header ist nicht explizit von jeder einzelnen Datei enthalten, aber in den Befehlszeilenoptionen habe ich/FI, dass force die PCH für jede im Projekt kompilierte Datei enthält.

+0

Können Sie einige Beispielbefehlszeilen anzeigen, die zum Aufrufen des Compilers und Linkers verwendet werden? Sind die/D-Makrodefinitionen in der cl.exe-Befehlszeile immer genau gleich? Alle Ihre Quelldateien enthalten die vorkompilierten Header, bevor ein anderer Header enthalten ist? –

+0

Beispiel-Befehlszeilen wurden hinzugefügt –

Antwort

2

Ich habe anscheinend mein eigenes Problem gelöst. Beim Vorkompilieren der Headerdatei generiert cl.exe eine OBJ-Datei. Da wir die interne Magie von Boost verwenden, um automatisch mit den benötigten Bibliotheken unter Windows zu verknüpfen, und unser Boost-Header # includes auch im vorkompilierten Header enthalten ist, sind diese Links ebenfalls in der .obj-Datei enthalten. Leider wird diese OBJ-Datei nicht zur Liste der OBJ-Dateien hinzugefügt, die verknüpft werden müssen (um in diesem Fall eine DLL zu erstellen).

Was funktionierte, war das manuelle Anhängen der OBJ-Datei, die während der Kompilierung des PCH generiert wurde, an das Argument LINKFLAGS. Dies zu 100% löst das Problem, das ich hatte. Vielleicht ist es an der Zeit, das msvc.py-Tool zu aktualisieren und einen Patch an SCons zu senden!

+0

Ich bin mir nicht sicher, ob ich verstehe - der Linker erzeugt eine .obj-Datei, die angegeben werden muss? Oder fehlt dem Linker-Befehl eine erforderliche OBJ-Datei, die Sie mit dem LINKFLAGS-Argument einfügen müssen? –

+0

Können Sie weitere Details dazu geben, wie Sie das gelöst haben? Z.B. Wie spezifiziert man das Argument LINKFLAGS? –

+0

Es ist ein Argument, das dem Konstrukteur von Scons gegeben wird. z.B. env.ComponentProgram ( LINKFLAGS = myLinkFlagsList, CXXFLAGS = myCXXFlagsList,) –

0

Es gibt 2 definiert beim Kompilieren, dass es, wenn der vorkompilierte Header Aufbau:

/D_USRDLL 
/D_WINDLL 

Soweit ich weiß, sind diese Relikte MFC. Ich weiß nicht wirklich etwas über sie, aber ich wäre nicht überrascht, wenn wxWidgets einige Abhängigkeiten von ihnen hätte. Ich bezweifle, dass Boost das tut (aber ich habe auch nicht nachgesehen).

+1

Fünf Minuten zu spät mit der falschen Antwort - froh, dass Sie Ihr Geheimnis gelöst haben. –