返回

如何在 MSVC 中使用 CMake 成功生成 *.vcxproj?

windows

*使用 CMake 在 MSVC 中成功生成 .vcxproj

问题

在使用 CMake 和 Visual Studio 为 Windows 构建共享库时,可能会遇到 .dll、.lib 和 *.exp 文件未生成的问题。这通常是由于 *.vcxproj 文件中 ${OutDir} 设置不正确造成的。

解决方法

1. 设置 CMAKE_*_OUTPUT_DIRECTORY

在 CMakeLists.txt 中,设置 CMAKE_*_OUTPUT_DIRECTORY 变量以指定输出目录。例如:

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)

2. 使用绝对路径设置 ImportLibrary

在生成的 *.vcxproj 文件中,将 <ImportLibrary>//pointmatcher.lib</ImportLibrary> 替换为 <ImportLibrary>${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pointmatcher.lib</ImportLibrary>

其他注意事项

  • 添加 set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) 到 CMakeLists.txt 中,以导出所有符号。
  • 使用 msbuild /m 命令进行并行构建,以提高速度。
  • 检查 CMake 日志以查找其他潜在错误。

步骤演示

CMakeLists.txt

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)

pointmatcher.vcxproj (部分)

  <PropertyGroup>
    <ImportLibrary>${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pointmatcher.lib</ImportLibrary>
  </PropertyGroup>

构建命令

cmake -G "Visual Studio 16 2019" .
msbuild /m /p:Configuration=Release

结论

通过这些步骤,CMake 应该可以正确生成 *.vcxproj 文件,并成功构建共享库。

常见问题解答

1. 为什么 ${OutDir} 会不正确?

这可能是由于 CMake 版本或 Visual Studio 配置不兼容造成的。

2. 如何避免并行构建时的错误?

确保您的 CMake 版本支持并行构建,并使用正确的生成器(例如 "Visual Studio 16 2019")。

3. 如何导出所有符号?

在 CMakeLists.txt 中添加 set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) 即可。

4. 如何解决 CMake 日志中的错误?

检查日志并确定错误源,然后根据错误信息进行调整。

5. 如何进一步优化构建过程?

使用 CMake 缓存并启用增量构建可以提高构建速度。