Я пытаюсь связать проект Visual Studio 2017, но я застрял в следующей ошибке компоновщика:
LINK : fatal error C1007: unrecognized flag '-Ot' in 'p2'
Я читал вопросы о том, что может быть причиной, но я не мог найти решение для своего проекта.
Детали заключаются в том, что из-за внешнего компонента, который мы не можем контролировать (компонент A), этот проект Visual Studio 2017 вынужден использовать версию цепочки инструментов C++ v14.13, то есть не самую последнюю (v14.14). Однако последний выпуск другой внешней предварительно скомпилированной статической библиотеки, над которой мы не имеем никакого контроля (компонент B), собран с версией v14.14 (я проверил с помощью извлечения из дампа отладочной версии библиотеки). Переключение моего проекта на инструментальную цепочку v14.14 действительно устраняет ошибку ссылки на компоненте B, но, к сожалению, это не решение для меня из-за компонента A. Использование более ранней версии компонента B также нежелательно, поскольку нам нужна функциональность в последней версии...
Однако что меня поражает, так это то, что флаг /Ot ("оптимизировать для скорости") существует со времен средневековья... Почему v14.13 не распознает его? Или это просто (неуклюже проявленный) вопрос несоответствия макета файла obj из-за различий в версиях? И, вероятно, связано с тем, что вообще означает «p2»?
Обновить
Я проверил вывод компоновщика с помощью флага /verbose, и все выглядит нормально (3600 строк Searching <lib>
, Found <function>
, Referenced in <obj>
и Loaded <lib>
).
Вплоть до конца, где я получаю следующие 6 строк:
1> Searching C:\PathToExternalLib\TheirStatic.lib:
1> Found UsedFunctionName
1> Referenced in MyOwnStatic.lib(MyOwnCompileUnit.obj)
1>LINK : fatal error C1007: unrecognized flag '-Ot' in 'p2'
1>LINK : fatal error LNK1257: code generation failed
1>Done building project "MyProject.vcxproj" -- FAILED.
И это все.
При посещении настройки command line
свойств ссылки проекта единственное, что указано (разбито на отдельные строки для удобства):
/OUT:"MyProject.dll"
/MANIFEST
/NXCOMPAT
/PDB:"MyProject.pdb"
/DYNAMICBASE "C:\PathToMyStatic.lib"
/IMPLIB:"MyProject.lib"
/DLL
/MACHINE:X64
/PGD:"MyProject.pgd"
/MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/ManifestFile:"MyProject.prm.intermediate.manifest"
/ERRORREPORT:PROMPT
/NOLOGO
/LIBPATH:"C:\PathToExternalStaticLib"
/LIBPATH:"C:\PathToAnotherExternalStaticLib"
/TLBID:1
Значит, никаких следов флага -Ot
там тоже нет...?
Update
моего поста о новых деталях. Но хотя я все еще заинтригован этим, мы решили двигаться дальше и использовать более старую версию Visual Studio (не набор инструментов 14.13 VS2017, а правильный набор инструментов VS2015); это делает эту ошибку спорной (версия их статической библиотеки VS2015 работает хорошо), а также дает нам некоторые дополнительные преимущества обратной совместимости с другими внешними компонентами. Так что большое спасибо за ваши усилия, и я оставлю это на ваше усмотрение, если вы хотите продолжить расследование :) - person Carl Colijn   schedule 19.11.2018