我正在使用 cmake 生成 Visual Studio 项目。
假设我需要使用以下 Microsoft 特定的库和标头:
c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\VS\UnitTest\lib\x64\Microsoft.VisualStudio.TestTools.CppUnitTestFramework.lib
)c:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt\crtdbg.h
)我不想将这些路径硬编码到我的 CMakeLists.txt 中,或强制开发人员在构建期间传入路径。
我希望能够做这样的事情:
# 1. get include paths somehow
# 2. get lib paths somehow
include_directories(
${MSVS_UnitTest_INCLUDE_DIR}
${Windows_SDK_INCLUDE_DIR}/ucrt
)
link_directories(
${MSVS_UnitTest_LIBRARIES_DIR}/x64
${Windows_SDK_LIBRARIES_DIR}/ucrt/x64
)
add_library(MyTest mytest.cpp)
target_link_libraries(MyTest
libucrt
Microsoft.VisualStudio.TestTools.CppUnitTestFramework
)
执行#1 和#2 的正确方法是什么?
至少对于#1(包括sdk的路径)我找到了一个解决方案。 如果您使用 Generator for Visual Studio,则 cmake 变量 CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 将填充包含文件夹的路径。 另一种方法是使用环境变量 $ENV{WindowsSdkDir} 和 $ENV{WindowsSDKVersion},源 cmake 也很可能从中获取此信息。
您可以通过运行下面列出的我的小批处理文件,在其 IDE 或命令提示符中找到最新 Visual Studio 默认使用的 SDK 路径。它调用另一个批处理文件winsdk.bat
,该文件由 Microsoft 编写,是 Visual Studio 安装的一部分,是 Visual Studio 用于检测和选择已安装 SDK 的“官方方式”。 TL;DR:它混合使用注册表和文件系统解析。每个版本的 Visual Studio 使用不同的
winsdk.bat
,但 VS2015 之后它们彼此非常相似。
@echo off
REM If you don't have it installed already, you can download VSWHERE.EXE from https://github.com/microsoft/vswhere
for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -legacy -property resolvedInstallationPath`) do (
set VSinstallDir=%%i
)
echo The latest Visual Studio is installed in: %VSinstallDir%
set VSCMD_ARG_HOST_ARCH=x64
set VSCMD_ARG_TGT_ARCH=x64
REM This call actually does the job of detecting the SDKs that you have installed on your system and picks the default one.
call %VSinstallDir%\Common7\Tools\vsdevcmd\core\winsdk.bat
echo WindowsSDKVersion=%WindowsSDKVersion%
echo WindowsSDKLibVersion=%WindowsSDKLibVersion%
echo UCRTVersion=%UCRTVersion%
echo WindowsSdkDir=%WindowsSdkDir%
echo UniversalCRTSdkDir=%UniversalCRTSdkDir%
echo WindowsSdkBinPath=%WindowsSdkBinPath%
echo WindowsSdkVerBinPath=%WindowsSdkVerBinPath%
echo WindowsLibPath=%WindowsLibPath%
echo INCLUDE=%INCLUDE%
echo LIB=%LIB%
echo LIBPATH=%LIBPATH%
注意:如果您愿意,可以将 VSCMD_ARG_HOST_ARCH
和
VSCMD_ARG_TGT_ARCH
变量设置为其他值。例如:
=x86
或
=arm
或
=arm64
%LIB%
和 %INCLUDE% 变量包含您要查找的文件的路径。