【问题标题】:warning LNK4206: precompiled type information not found; '' not linked or overwritten; linking object as if no debug info警告 LNK4206:未找到预编译的类型信息; '' 未链接或覆盖;链接对象好像没有调试信息
【发布时间】:2013-11-23 22:05:21
【问题描述】:

我正在考虑将预编译的头文件添加到我们的 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 文件。在这种情况下,您应该重新编译您的代码并对剩余的对象(未使用 /Yc 编译的对象)使用 /Yl。

我不认为这是我的问题,但也许?

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

这里是链接命令

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 依赖\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 输出\windows-x86-MD-unicode-vs2008-rel\obj-shared\dependencies\csflogger\src\main\VersionInfo.obj 输出\windows-x86-MD-unicode-vs2008-rel\obj -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 。这可以在链接命令中看到

依赖\预编译\预编译.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 /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\precompile 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 "/Fpdependencies\precompiled\precompiled.pch"

在有和没有警告的情况下也是如此。

【问题讨论】:

    标签: c++ warnings scons precompiled


    【解决方案1】:

    最后好像

    env.Append(LIBS = PCH_OBJ)
    

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

    【讨论】:

      【解决方案2】:

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

      /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 的编译命令。

      【讨论】:

      • 敏锐的眼光。我没有抓住那个。该行来自 scons 本身。我用 pdb 得到了它。即导入 pdb pdb.set_trace() env.subst(env['PCHCOM'])。不知道为什么要打印这个。在实际的命令输出中我看不到它。我将把链接命令添加到我原来的问题中。
      • 其实我知道为什么会这样。在我争先恐后地解决问题时,我添加了 env.Append(CPPPATH=Dir('.').abspath)。这可以准确地解释为什么包含路径很奇怪。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-05
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多