我正在按照一些规则对文件夹中的源进行分组,我希望能够单独测试每个组以便更快地进行迭代。为此,我想要CMake为每个组生成一个可执行文件。我将项目结构简化为:
root
build
group_1
CMakeLists.txt
group_1_file_1.cpp
group_1_tests
CMakeLists.txt
group_1_file_1_tests.cpp
其中group_1/CMakeLists.txt
是:
SET(group_1_srcs
${CMAKE_CURRENT_SOURCE_DIR}/group_1_file_1.cpp
)
#Generate standalone application for unit tests when cmake is started with this CMakeLists as root
IF(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
ADD_SUBDIRECTORY("group_1_tests/")
ENDIF()
和group_1/group_1_tests/CMakeLists.txt
是
PROJECT(group_1_tests)
SET(group_1_tests_srcs
${CMAKE_CURRENT_SOURCE_DIR}/group_1_file_1_tests.cpp
)
ADD_EXECUTABLE(${PROJECT_NAME} "${group_1_tests_srcs}" "${group_1_srcs}")
从cmake ../group_1
运行root/build/
会生成我想要的项目,root/build/group_1_tests/group_1_tests.sln
,还会生成root/build/Project.sln
相同的文件&设置为上一个。
您能否解释一下为什么要生成这些项目以及如何避免它?
答案 0 :(得分:0)
答案在the project()
command documentation:
项目的顶级
CMakeLists.txt
文件必须包含对project()
命令的文字直接调用...如果不存在此类调用,则CMake将隐式地将一个添加到顶部,以启用默认语言(C
和CXX
)。
所以Project
是默认项目的名称。从那时起,CMake为包含另一个.sln
命令的所有CMakeLists.txt
生成project()
解决方案。
我建议您忽略根解决方案文件(如果您不想要它)或重构您的项目以在根project()
中进行单个CMakeList.txt
命令调用(因为您的子级别)如果没有顶级项目,项目将不会独立运行。
<强>参考强>