cmake:查找/添加 Visual Studio 或 Windows sdk 库和标头的正确方法?

问题描述 投票:0回答:2

我正在使用 cmake 生成 Visual Studio 项目。

假设我需要使用以下 Microsoft 特定的库和标头:

  • Microsoft C++ 单元测试框架(示例库位置:
    c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Auxiliary\VS\UnitTest\lib\x64\Microsoft.VisualStudio.TestTools.CppUnitTestFramework.lib
  • crtdbg 用于查找内存泄漏(示例标头位置:
    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 的正确方法是什么?

c++ visual-studio cmake
2个回答
3
投票

至少对于#1(包括sdk的路径)我找到了一个解决方案。 如果您使用 Generator for Visual Studio,则 cmake 变量 CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 将填充包含文件夹的路径。 另一种方法是使用环境变量 $ENV{WindowsSdkDir} 和 $ENV{WindowsSDKVersion},源 cmake 也很可能从中获取此信息。


0
投票

您可以通过运行下面列出的我的小批处理文件,在其 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% 变量包含您要查找的文件的路径。

© www.soinside.com 2019 - 2024. All rights reserved.