0

我正在考虑将预编译的头文件添加到我们的 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"

对于有和没有警告的情况,它再次相同。

4

2 回答 2

0

最后似乎

env.Append(LIBS = PCH_OBJ)

确实解决了这个警告。但是,如果我更改了预编译的标头本身,它会重新出现。我发现解决此问题的唯一方法是进行清洁。之后警告消失了(直到我再次修改了预编译的头文件)。

于 2013-12-08T19:29:15.393 回答
0

最后一次扩展看起来非常可疑。所有那些

/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

看起来像一个字符串被 python 解释为一个列表(因为它会尝试这样做)。您的变量之一是否扩展为 :\Development\systemservice\dependencies\precompiled ?(我只是通过阅读上面每个 args 的最后一个字符得到的)如果是这样,请将其放入列表或元组中,它应该会有所帮助。

如果这不能解决问题:由于错误来自链接器,请显示实际运行的链接器命令,以及错误消息中显示的对象之一的编译命令。

于 2013-11-15T16:43:05.683 回答