我正在考虑将预编译的头文件添加到我们的 scons 项目中。我关注了这篇文章http://chadaustin.me/2009/05/unintrusive-precompiled-headers-pch/并想出了
if ARGUMENTS.get('PRECOMPILED', 'FALSE') == 'TRUE':
PCH, PCH_OBJ = env.PCH('precompiled.cpp')
env['PCH'] = PCH
env['PCHSTOP'] = 'precompiled.h'
env.Append(CPPFLAGS=['/FI' + 'precompiled.h'])
'/FI' 意味着我不需要手动将 precompiled.h 添加到每个 .cpp 文件中。
但是...我收到每个 .obj 文件的警告
warning LNK4206: precompiled type information not found;
'xxx.obj' not linked or overwritten; linking object as if no debug info
我似乎无法弄清楚。
对于此警告,我不清楚 Microsoft 文档。http://msdn.microsoft.com/en-us/library/cf1aswwe.aspx
使用 /Yc 编译的给定目标文件要么未在 LINK 命令中指定,要么已被覆盖。
我将如何解决这个问题?
此警告的常见情况是使用 /Yc 编译的 .obj 位于库中,并且代码中没有对该 .obj 的符号引用。在这种情况下,链接器不会使用(甚至看不到) .obj 文件。在这种情况下,您应该重新编译您的代码并将 /Yl 用于剩余的对象(未使用 /Yc 编译的对象)。
我不认为这是我的问题,但也许?
scons 运行以下命令行来创建 pdb
即环境['PCHCOM']
'$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS'
扩展为即 env.subst(env['PCHCOM'])
'cl /Fo /TP /EHsc /nologo /errorReport:prompt /W3 /EHsc /Z7 /MD /O2 /FIprecompiled.h /DNDEBUG /D_UNICODE /DUNICODE /DWIN32 /DCSFUNIFIED_EXPORTS /DUNIFIED_DLL /IC /I: /I\ /ID /Ie /Iv /Ie /Il /Io /Ip /Im /Ie /In /It /I\ /Is /Iy /Is /It /Ie /Im /Is /Ie /Ir /Iv /Ii /Ic /Ie / I\ /Id /Ie /Ip /Ie /In /Id /Ie /In /Ic /Ii /Ie /Is /I\ /Ip /Ir /Ie /Ic /Io /Im /Ip /Ii /Il /Ie / id /c /Ycprecompiled.h /Fp'
更新
添加 GaryO 要求的信息
注意我已经将代码更新为
if ARGUMENTS.get('PRECOMPILED', 'FALSE') == 'TRUE':
PCH, PCH_OBJ = env.PCH('precompiled.cpp')
env['PCH'] = PCH
env['PCHSTOP'] = 'precompiled.h'
env.Append(CPPFLAGS=['/FI' + 'precompiled.h'])
env.Append(LIBS = PCH_OBJ)
试图解决警告。
创建预编译头的命令
cl /Fodependencies\precompiled\precompiled.obj /TP /EHsc /nologo /errorReport:prompt /W3 /EHsc /Z7 /MD /O2 /FIprecompiled.h /DNDEBUG /D_UNICODE /DUNICODE /DWIN32 /Idependencies\precompiled /c dependencies\precompiled \precompiled.cpp /Ycprecompiled.h /Fpdependencies\precompiled\precompiled.pch
这是链接命令
链接 /nologo /DEBUG /OPT:REF /OPT:ICF /DEBUG /dll /out:out\windows-x86-MD-unicode-vs2008-rel\bin\csflogger.dll /imlib:out\windows-x86-MD- unicode-vs2008-rel\bin\csflogger.lib 依赖项\precompiled\precompiled.obj out\windows-x86-MD-unicode-vs2008-rel\bin\apr-1.lib out\windows-x86-MD-unicode-vs2008 -rel\bin\aprutil-1.lib out\windows-x86-MD-unicode-vs2008-rel\bin\log4cxx.lib ws2_32.lib DnsAPI.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib psapi.lib out\windows-x86-MD-unicode-vs2008-rel\obj-shared\dependencies\csflogger\src\main\ CSFLog.obj out\windows-x86-MD-unicode-vs2008-rel\obj-shared\dependencies\csflogger\src\main\VersionInfo.obj out\windows-x86-MD-unicode-vs2008-rel\obj-shared\依赖\csflogger\src\main\logger_utils。obj out\windows-x86-MD-unicode-vs2008-rel\obj-shared\dependencies\csflogger\src\main\CSFLogger.obj
在初始构建中,这不会产生警告。但是,如果我随后修改项目(例如注释掉 precomipled.h 中的一行),我会收到上述警告。即即使链接命令是相同的。
通过添加
env.Append(LIBS = PCH_OBJ)
我以为我正在解决这个问题。即因为应该找到.obj。这可以在链接命令中看到
依赖项\预编译\预编译.obj
但它不能解决任何问题:(。
为了完整起见,这里是用于使用预编译头进行编译的命令
cl /Fooout\windows-x86-MD-unicode-vs2008-rel\obj-shared\src\framework\SystemServiceDependencyInjector.obj /c src\framework\SystemServiceDependencyInjector.cpp /TP /EHsc /nologo /errorReport:prompt /W3 /EHsc /Z7 /MD /O2 /FI预编译。h -W3 -WX /wd4250 /wd4251 /DNDEBUG /D_UNICODE /DUNICODE /DWIN32 /DCSFUNIFIED_EXPORTS /DUNIFIED_DLL /DUSE_TR1_SMART_PTR /DUSE_TR1_SMART_PTR /DWIN32 /DCSFUNIFIED_EXPORTS /DUNIFIED_DLL /Idependencies\precompiled /Iinclude /Iapi /Itestutils /Idependencies\boost Foundation\include\portability /Idependencies\csf2g-foundation\include\deprecated /Idependencies\csf2g-foundation\include /Idependencies\csflogger\include /Idependencies\log4cxx\include /Idependencies\libxml2\include /Idependencies\libcurl\include /Idependencies\ libcurl\windows\include /Idependencies\ciscossl\releaseTempCiscoSSLTopFolder\inc32 /Idependencies\csf2g-idm\include /Idependencies\jcfcoreutils\include /Idependencies\httpdownloader\include /Idependencies\servicesframework\include /Idependencies\servicesframework\api /Idependencies\configservice- api/Idependencies\csf2g-foundation\include\dnsutils /Idependencies\csf2g-uc-service-locator\include /Idependencies\ucm9-config\include /Idependencies\ucm9-config\src /Idependencies\ucm9-config\src\dns /Idependencies \configservice\include /Idependencies\configservice\api /Idependencies\csfnetutils\include /Yuprecompiled.h "/Fpdependencies\precompiled\precompiled.pch"
对于有和没有警告的情况,它再次相同。