我维护一个C ++几何库,该库使用#defines从相同的源代码以两种不同的样式进行编译,即针对2D / 2.5D。这两种形式针对Win32 / x64以及作为Debug / Release版本进行编译。因此,为VS2008、2010、2012、2013、2015和2017年每个创建了8个DLL。当前,我使用手动创建的Visual Studio解决方案:
和批处理构建。它可以工作,但是我宁愿使用CMake通过命令行编译DLL。无需为Visual Studio IDE创建解决方案,因为源代码是在Linux下开发的。
直到现在我还是CMake用户,因此我想问一下以下概述的解决方案是否有意义:
问:当必须更改外壳程序或至少更改环境变量以匹配不同的编译器时,如何编写24个CMake调用的脚本?
问:不能在CMakeLists.txt中指定调试/发布Win32 / 64,因此必须将其传递给cmake命令是否正确?
以防万一:该库已在许多项目中使用,用户确实需要对旧编译器的支持。也许不是VS2008,但VS2010仍然很受欢迎。
答案 0 :(得分:1)
以上内容有意义吗?
是的
必须更改shell或至少更改环境变量以匹配不同的编译器时,如何编写对CMake的24个调用的脚本?
一个接一个吗?
cmake -S . -B 17_64_R -G "Visual Studio 15 2017" -A x64 -D CMAKE_BUILD_TYPE=Release
cmake --build 17_64_R --target all
cmake -S . -B 17_64_D -G "Visual Studio 15 2017" -A x64 -D CMAKE_BUILD_TYPE=Debug
cmake --build 17_64_D --target all
... and so on ...
cmake -S . -B 08_32_D -G "Visual Studio 9 2008" -A Win32 -D CMAKE_BUILD_TYPE=Debug
cmake --build 08_32_D --target all
在CMakeLists.txt中不能指定Debug / Release,Win32 / 64是否正确,因此必须将其传递给cmake命令吗?
不,可以。正确的是,不应在cmake配置中指定信息 。 Cmake是用于配置构建的工具,因此它将可移植到不同的体系结构。如果使用cmake的目的是可移植的,那么您为什么随后决定限制cmake仅生成一种配置? (最常见的答案:使用cmake丰富的功能来生成正确的构建系统)。这不是一个好习惯。但是您总是可以set(CMAKE_BUILD_TYPE "Debug") set(CMAKE_GENERATOR "Visual Studio 17")
,有时可以这样做,但这只是为了测试cmake配置。
一个用于2D,另一个用于2.5D。使用SET_TARGET_PROPERTIES,应该可以传递不同的#define。
这看起来很奇怪。只需添加到CMakeLists.txt:
add_executable(final_executable ...)
# then below
if(${FLAVOR} STREQUAL "2D")
target_compile_definitions(final_executable
PUBLIC
FLAVOR_2D=1
SOME_OTHER_MACRO_YOU_WOULD_LIKE_TO_SET="2D FLAVOR"
)
target_link_libraries(final_executable PUBLIC 2d_library)
# ... and so on ...
elif(${FLAVOR} STREQUAL "2.5D")
target_compile_definitions(final_executable
PUBLIC
FLAVOR_2_5D=1
SOME_OTHER_MACRO_YOU_WOULD_LIKE_TO_SET="2.5D FLAVOR"
)
target_link_libraries(final_executable PUBLIC 2_5d_library)
else()
message(FATAL_ERROR "You must specify FLAVOR to be 2D or 2.5D")
endif()
然后使用以下命令配置构建系统:
# for 2D configuration
cmake ... -D FLAVOR="2D" ...
# for 2.5D configuration
cmake ... -D FLAVOR="2.5D" ...
设置宏时无需使用set_target_properties
。而且您不应该这样做,确实有cmake命令可以做到这一点。有target_compile_definitions
,target_inlude_directories
,target_link_libraries
,最后是最新的cmake target_link_options
(这在旧版本上是用target_link_libraries
完成的)。甚至target_sources
也让您添加源。通常set_target_properties
用于高级内容,例如interprocedural_optimization等。