2016-12-09 12 views
0

У нас есть проект драйвера Visual Studio 2015. По разным причинам мы используем «make» (инструмент unix, созданный для окон) для создания всего нашего продукта. Также предпочтительно использовать make для сборки компонентов только для Windows (поддерживает процесс сборки согласованно).Невозможно реплицировать Visual Studio Build

Запуск сервера 2012R2, VS 2015 Update 3, DDK 10 и SDK 10.

Проект строит штраф в VS2015 и работе водителя, а значит, кодовое хорошо.

Я включил подробный вывод сборки и захватил его, чтобы проанализировать, что делает VS для создания проекта (драйвер - это просто куча C-файлов, похоже, не является чем-то слишком разрушающим землю уникальным). VS build устанавливает LIB, LIBPATH и INCLUDE переменные, а затем выдает команду cl.exe для сборки, а затем команду link.exe для связи. Также есть команды для создания файла сообщения (mc.exe) и файла ресурсов «rc.exe». Я захватил все эти команды и включил их в make-файл.

Я могу получить проект для компиляции, но моя проблема связана с фазой связи. Я покажу ошибку в нескольких строках. Я попробовал просто запустить команды (из журнала) самостоятельно в «VS2015 x64 Native Tools Command Prompt» (%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64), и я получаю ту же ошибку.

Когда я соединяю, я получаю:

LINK : error LNK2001: unresolved external symbol GsDriverEntry 
os_win.obj : error LNK2001: unresolved external symbol __stdio_common_vsprintf 
winbuild\x64\Win7Release\driver.sys : fatal error LNK1120: 2 unresolved externals 

я должен был сделать одно изменение из cl.exe командной строки, VS вошедшего, который должен был указать/GS- (VS включен параметр). В противном случае, когда я бегу компиляции и компоновки comands, я получаю кучу дополнительных ошибок:

os_win.obj : error LNK2001: unresolved external symbol __security_cookie 

Итак, погуглить ошибку vsprintf, я наткнулся на предложения, чтобы связать с legacy_stdio_definitions.lib, чтобы получить доступ к этим функциям, но не работа (и используя nm.exe Cygwin, чтобы исследовать ОМТ показал, что функции vsprintf являются U ndefined.

Если я построю из Makefile, я теряю ошибку о GsDriverEntry быть неопределенным, но я до сих пор есть ошибки vsprintf .

Я также попытался удалить/no defaultlib link option ... no effect.

Итак, у меня полная потеря относительно того, что происходит. Для меня нет никакого смысла, что VS может построить проект, но я не могу, используя те же команды. Какие подробности или концепцию мне не хватает?

Моя ссылка командной строки:

link /OUT:Win7Release/driver.sys \ 
/NOLOGO /INCREMENTAL:NO /IGNOREIDL /OPT:ICF /MAP /SUBSYSTEM:CONSOLE /OPT:REF \ 
/PDB:none /MACHINE:X64 /MANIFEST:NO /WX /PROFILE /kernel /Driver /RELEASE \ 
/VERSION:"10.0" /osversion:10.0 /ENTRY:"GsDriverEntry" \ 
/IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221,4108,4088,4218,4218,4235 \ 
/ERRORREPORT:PROMPT /MERGE:"_TEXT=.text;_PAGE=PAGE" /SECTION:"INIT,d" \ 
/IMPLIB:"Win7Release/driver.lib" /SUBSYSTEM:NATIVE",6.01" \ 
.. list of obj files .. \ 
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib \ 
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \ 
legacy_stdio_definitions.lib ntoskrnl.lib hal.lib wmilib.lib BufferOverflowK.lib 

ответ

0

Хорошо, хорошо, я нашел this post, который ранее в этом году помог мне с другой подобной проблемой ... кажется, что vsprintf также объявлена ​​инлайн, в настоящее время. Параметр _NO_CRT_STDIO_INLINE as/D для cl.exe позволяет создавать код и связывать его.

Итак, почему проект Visual Studio 2015 будет построен правильно? Это определение НЕ является результатом сборки.

+0

Это нормально, чтобы ответить на ваш собственный вопрос, но если вы хотите, чтобы другой вопрос ответил, это должен быть другой вопрос. –

+0

Когда вы захватили команды из сборки _VS_, вы также захватили строки оболочки оболочки, присутствующие при запуске инструментов? 'cl.exe' и' link.exe' чувствительны к некоторым из них. – bobbogo