предупреждение LNK4206: предварительно скомпилированная информация о типе не найдена; » не связано или не перезаписано; связывание объекта, как будто нет отладочной информации

Я смотрю на добавление предварительно скомпилированных заголовков в наш проект 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, либо был перезаписан.

Как бы я решить это?

Распространенным сценарием для этого предупреждения является случай, когда .obj, скомпилированный с / Yc, находится в библиотеке, и когда в вашем коде нет ссылок на этот символ .obj. В этом случае компоновщик не будет использовать (или даже видеть) файл .obj. В этой ситуации вам следует перекомпилировать код и использовать / Yl для остальных объектов (объектов, которые не скомпилированы с / Yc).

Я не думаю, что это моя проблема, но может быть?

scons запускают следующую командную строку для создания pdb

то есть env [‘PCHCOM’]

‘$ CXX / Fo $ {TARGETS [1]} $ CXXFLAGS $ CCFLAGS $ CPPFLAGS $ _CPPDEFFLAGS $ _CPPINCFLAGS / c $ SOURCES / Yc $ PCHSTOP / Fp $ {TARGETS [0]} $ CCPDLHFSP

Который расширяется до
то есть env.subst (env [‘PCHCOM’])

‘cl / Fo / TP / EHsc / nologo / errorReport: приглашение / W3 / EHsc / Z7 / MD / O2 /FIprecompiled.h / DNDEBUG / D_UNICODE / DUNICODE / DWIN32 / DCSFUNIFIED_EXPORTS / DUNIFIED_DLL / IC / I: / I \ / ID / Т.е. / Iv / Ie / Il / Io / Ip / Im / Ie / I / In
/ Это / Я \ / Есть / Iy / Есть / Это / То есть / Im / Есть / То есть / Ir / Iv / Ii / Ic / Ie / I \ / Id
/ Ie / Ip / Ie / In / Id / Ie / I / I / I / Ie / I / I / Ip / Ir / Ie / Io / 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: подсказка / W3 / EHsc / Z7 / MD / O2 /FIprecompiled.h / DNDEBUG / D_UNICODE / DUNICODE / DWIN32 / Idependencies \ precompiled / c зависимости \ 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 / 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 из \ 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), я получу предупреждение выше. даже если команда link та же самая.

Добавляя

env.Append (LIBS = PCH_OBJ)

Я думал, что я решаю проблему. то есть, потому что .obj должен быть найден. Это можно увидеть в команде link

Зависимости \ прекомпилирована \ 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: приглашение / W3 / 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 \ / предварительной компиляции 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 \ httpralowork \ infradeswork \ include clude / 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»

Опять то же самое для сценария с & без предупреждения.

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 как список (как он попытается сделать). Один из ваших vars расширился до: \ Development \ systemservice \ dependencies \ precompiled? (Я только что получил это, прочитав последний символ каждого из этих аргументов выше). Если так, поместите это в список или кортеж, и это должно помочь.

Если это не помогло: поскольку ошибка исходит от компоновщика, пожалуйста, покажите команду компоновщика, которая фактически запускается, а также команду компиляции для одного из объектов, который отображается в сообщениях об ошибках.

0

Другие решения

В конце концов, кажется, что

env.Append(LIBS = PCH_OBJ)

действительно разрешил это предупреждение. Однако, если бы я изменил сам скомпилированный заголовок, он снова появился бы. Единственный способ решить эту проблему — сделать чистку. После этого предупреждение исчезло (пока я снова не изменил предварительно скомпилированный заголовок).

0

По вопросам рекламы [email protected]