如何在 MSVC 中使用 CMake 成功生成 *.vcxproj?
2024-03-22 23:16:48
*使用 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 缓存并启用增量构建可以提高构建速度。