【发布时间】:2020-06-23 10:38:47
【问题描述】:
我正在处理一个非常大的项目,我正在从使用自定义 Makefile 转向使用 cmake,但我仍然缺少使用 Makefile 实现的功能。
项目有很多子目录,每个子目录都编译成静态库,然后链接到最终的可执行文件中。
这是一个小例子
src/
lib1/
lib2/
lib3/
main.cpp
CMakeLists.txt
在 CMakeLists.txt 中可能是这样的:
add_subdirectory(lib1)
add_subdirectory(lib2)
add_subdirectory(lib3)
add_executable(test main.cpp)
target_link_libraries(test PUBLIC lib1 lib2 lib3)
我想调试最终的可执行文件,但是我不想构建所有带有调试符号且没有优化的静态库,因为那样调试会变得太慢。
所以我想用CMAKE_BUILD_TYPE=Release 和lib1 和lib3 和CMAKE_BUILD_TYPE=Debug 构建lib2。
请记住,实际上有大约 10 个库而不是三个库,我希望能够为每个库执行此操作,并同时为其中多个库执行此操作。
有没有办法从主要的CMakeLists.txt 做到这一点?
我更希望能通过命令行实现这一点:
cmake -DDEBUG_LIBS={lib1,lib3} /path/to/src
cmake --build .
【问题讨论】:
-
CMake 3.17 将在一个构建中引入多种构建类型。不确定这是否足以满足您的需求。
-
引用那个?
-
这将使用相同的配置构建所有目标,它只允许您构建两种不同的配置。这不是我要问的。
-
是的,您必须运行构建两次才能获得所需的混合配置。
-
不要将
CMAKE_BUILD_TYPE设置为空白或自定义一个,您可以在其中准确设置您想要的基本标志。然后根据下面的答案和 cmets 为您想要的库添加额外的调试和优化。我建议创建一个每个库目标调用的函数,检查它是否显示在DEBUG_LIBS中,然后使用正确的值调用target_compile_options。但是您应该将其设置为-DDEBUG_LIBS=lib1;lib3以便列表处理有效。