Установите PlatformTools в cl.exe

Я пытаюсь создать WolfSSL, который использует функцию CryptAcquireContext Windows API. Я пытаюсь собрать его с помощью «cl.exe». Я не хочу использовать «nmake.exe» или «MSBuild.exe», просто «cl.exe».

Если я использую Visual Studio для сборки, я могу установить параметр <PlatformToolset>v120</PlatformToolset> в файле 'vcxproj', который определяет версию набора инструментов платформы. Если этот параметр установлен, Visual Studio компилирует и связывает код без ошибок.

Если я попытаюсь скомпилировать и связать с помощью «cl.exe», я получу следующее сообщение:

error LNK2019: unresolved external symbol __imp__CryptAcquireContextA@20

Поскольку Visual Studio работает успешно, проблема не связана с отсутствующим пакетом SDK.

документация для cl.exe не содержит никакой информации о набор инструментов платформы. Я попытался добавить /p:PlatformToolset=v120, как было предложено здесь, но кажется, что только MSBuild принимает этот вариант.

Хотя описание моей проблемы длинное, мой вопрос прост. Как определить набор инструментов платформы для «cl.exe»?

-- РЕДАКТИРОВАТЬ --

добавление Advapi32.lib после опции \link устранило проблему связывания.

Однако означает ли это, что я должен указать компоновщику использовать каждый родной файл Windows '.lib', который я использую? Мне не нужно делать это для стандартной библиотеки. Есть ли способ заставить cl автоматически включать все родные файлы Windows '.lib', как это делается со стандартной библиотекой?


person LordCapybara    schedule 10.09.2017    source источник
comment
ваша проблема в очень плохом знании. вы даже не понимаете разницы между компиляцией и линковкой. и прочитайте страницу msdn для CryptAcquireContext - слово Advapi32.lib вам ничего не говорит?   -  person RbMm    schedule 10.09.2017
comment
Да, я понимаю разницу между компиляцией и компоновкой. Но 'ln' делает и то, и другое, верно? Я попытался добавить Advapi32.lib после опции \link. Код связан нормально. Однако означает ли это, что я должен включать каждый родной файл Windows '.lib', который я использую? Мне не нужно делать это для стандартной библиотеки. Есть ли способ заставить cl включать все эти файлы одновременно?   -  person LordCapybara    schedule 10.09.2017
comment
вам нужно включить все .lib файлы, из которых вы импортируете напрямую.   -  person RbMm    schedule 10.09.2017
comment
Таковы преимущества использования IDE. Когда вы создаете новый проект, он по умолчанию уже предоставляет инструкции по связыванию для нескольких распространенных библиотек Windows. Например, kernel32.lib, user32.lib, gdi32.lib. И да, advapi32.lib. Когда вы делаете это вручную, вы должны ввести их самостоятельно. По крайней мере, рассмотрите возможность использования msbuild.exe. Набор инструментов выбирается командной строкой Visual Studio, которую вы использовали для инициализации среды, она устанавливает переменную LIB.   -  person Hans Passant    schedule 10.09.2017
comment
Спасибо Ханс Пассант! Я предполагал, что «cl» будет связывать библиотеки Windows по умолчанию или путем добавления простой опции CLI. Я думаю, что использование MSBuild было бы проще...   -  person LordCapybara    schedule 11.09.2017