每个目标有不同的 CMAKE_BUILD_TYPE

Chr*_*isG 7 c++ cmake

我正在开发一个非常大的项目,正在从使用自定义 Makefile 转向使用 cmake,但我仍然缺少使用 Makefile 实现的功能。

该项目有很多子目录,每个子目录都被编译成静态库,然后链接到最终的可执行文件中。

这是一个小例子

src/
  lib1/
  lib2/
  lib3/
  main.cpp
  CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

在 CMakeLists.txt 中可能是这样的:

add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(lib3)
add_executable(test main.cpp)
target_link_libraries(test PUBLIC lib1 lib2 lib3)
Run Code Online (Sandbox Code Playgroud)

我想调试最终的可执行文件,我不想使用调试符号构建所有静态库且不进行优化,因为这样调试就会变得太慢。

所以我想lib2CMAKE_BUILD_TYPE=Releaselib1lib3构建CMAKE_BUILD_TYPE=Debug

请记住,实际上有大约 10 个库,而不是三个,我希望能够为每个库执行此操作,并同时为多个库执行此操作。

有没有办法从 main 做到这一点CMakeLists.txt

我更希望能够从命令行实现这一点:

add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(lib3)
add_executable(test main.cpp)
target_link_libraries(test PUBLIC lib1 lib2 lib3)
Run Code Online (Sandbox Code Playgroud)

Fre*_*red 1

不要CMAKE_BUILD_TYPE将其保留为空白或进行自定义设置,以准确设置您想要的基本标志。然后为所需的库添加额外的调试和优化。我建议创建一个函数(或宏),每个库目标都会调用该函数(或宏)来检查它是否出现在其中DEBUG_LIBS,然后使用正确的值调用 target_compile_options 。但您应该设置为-DDEBUG_LIBS=lib1;lib3以便列表处理有效。

function(check_debug libname)
  if(${libname} IN_LIST DEBUG_LIBS)
    target_compile_options(${libname} PRIVATE -g -O0)
  endif()
end_function()
Run Code Online (Sandbox Code Playgroud)