更改为CMake-一个源,48个DLL

时间:2019-03-12 19:27:49

标签: cmake

我维护一个C ++几何库,该库使用#defines从相同的源代码以两种不同的样式进行编译,即针对2D / 2.5D。这两种形式针对Win32 / x64以及作为Debug / Release版本进行编译。因此,为VS2008、2010、2012、2013、2015和2017年每个创建了8个DLL。当前,我使用手动创建的Visual Studio解决方案: enter image description here

和批处理构建。它可以工作,但是我宁愿使用CMake通过命令行编译DLL。无需为Visual Studio IDE创建解决方案,因为源代码是在Linux下开发的。

直到现在我还是CMake用户,因此我想问一下以下概述的解决方案是否有意义:

  1. 创建一个CMakeLists.txt,其中包含两个add_library调用,一个用于2D,一个用于2.5D。使用SET_TARGET_PROPERTIES,应该可以传递不同的#define。
  2. 例如,命令“ cmake -G“ Visual Studio 11” -A x64 -DCMAKE_BUILD_TYPE =发布..“应该为VS2012 / x64 / Release创建两个DLL风格。
  3. 对于VS 2008-2017,Debug / Release,Win32 / x64,它将需要24个此类调用,而我会将它们放入脚本中。
问:以上说法有意义吗?

问:当必须更改外壳程序或至少更改环境变量以匹配不同的编译器时,如何编写24个CMake调用的脚本?

问:不能在CMakeLists.txt中指定调试/发布Win32 / 64,因此必须将其传递给cmake命令是否正确?

以防万一:该库已在许多项目中使用,用户确实需要对旧编译器的支持。也许不是VS2008,但VS2010仍然很受欢迎。

1 个答案:

答案 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_definitionstarget_inlude_directoriestarget_link_libraries,最后是最新的cmake target_link_options(这在旧版本上是用target_link_libraries完成的)。甚至target_sources也让您添加源。通常set_target_properties用于高级内容,例如interprocedural_optimization等。