警告LNK4206:未找到预编译类型信息; ''没有链接或覆盖;链接对象就像没有调试信息一样

时间:2013-11-11 22:56:00

标签: c++ warnings scons precompiled

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

即。 ENV [' PCHCOM']

  

' $ CXX / Fo $ {TARGETS [1]} $ CXXFLAGS $ CCFLAGS $ CPPFLAGS $ _CPPDEFFLAGS $ _CPPINCFLAGS / c $ SOURCES / Yc $ PCHSTOP / Fp $ {TARGETS [0]} $ CCPDBFLAGS $ PCHPDBFLAGS&# 39;

扩展到 即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

这是链接命令

  

link / nologo / DEBUG / OPT:REF / OPT:ICF / DEBUG / dll /out:out\windows-x86-MD-unicode-vs2008-rel\bin\csflogger.dll / implib:out \ windows-x86 -MD-unicode-vs2008-rel \ bin \ csflogger.lib dependencies \ 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 \ _dbj -shared \ dependencies \ 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。这可以在链接命令

中看到
  

依赖性\预编译\ precompiled.obj

但它没有解决任何问题:(。

为了完整性,这里是用于使用预编译头

进行编译的命令
  

cl /Foout\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 /FIprecompiled.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 / Idependencies \ csf2g-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&#34; / Fpdependencies \ precompiled \ precompiled.pch&#34; < / p>

对于带有&amp;的场景,情况也是如此。没有警告。

2 个答案:

答案 0 :(得分: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的最后一个字符来得到它)如果是这样,把它放到列表或元组中它应该有帮助。

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

答案 1 :(得分:0)

最终似乎

env.Append(LIBS = PCH_OBJ)

确实解决了这个警告。但是,如果我更改了预编译的标题本身,它将重新出现。我发现解决这个问题的唯一方法就是干净利落。之后警告消失了(直到我再次修改了预编译的标题)。