将Source的子目录添加到cmake项目中

2Ni*_*meo 49 cmake

我有没有分成库的项目,但源是在目录树中组织的.我不知道如何告诉cmake进入目录,然后将该目录中的源添加到父目录中定义的项目.我尝试过以下方法:

在project/source/CMakelists.txt中:

set(SOURCE
    ${CMAKE_CURRENT_SOURCE_DIR}/unitTest/main.cpp
  )
add_subdirectory("${PROJECT_SOURCE_DIR}/folder1")
add_executable(UnitTestRNG ${SOURCE} ${HEADERS})
Run Code Online (Sandbox Code Playgroud)

然后在project/source/folder1/CMakeLists.txt中:

set(SOURCE
   ${SOURCE}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
)
set(HEADERS
   ${HEADERS}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
)
Run Code Online (Sandbox Code Playgroud)

使用一些message()语句,我发现子文件夹将获取SOURCE变量的内容,但是对该变量的新赋值将不会在返回到父CMakeLists.txt时持续存在

寻找示例并在cmake教程中得出结论: - 源文件结构通常在项目中是平的 - 如果代码被分成文件夹,它通常被分成相应的库.

我想知道是否有一些"最佳实践",我通过尝试这种结构而偏离它.

Chr*_*uns 34

就像arrowdodger的第二部分的答案所说:在project/source/folder1/CMakeLists.txt中:

set(SOURCE
   ${SOURCE}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.cpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.cpp
   PARENT_SCOPE
)
set(HEADERS
   ${HEADERS}
   ${CMAKE_CURRENT_SOURCE_DIR}/file1.hpp
   ${CMAKE_CURRENT_SOURCE_DIR}/file2.hpp
   PARENT_SCOPE
)
Run Code Online (Sandbox Code Playgroud)

  • 在最新版本的cmake中,这仍然是推荐的方法吗? (4认同)
  • 否。请参阅[此答案](/sf/answers/3800012891/) (2认同)

小智 27

从 CMake 3.1 开始,有一种从子目录添加源代码的新方法: target_sources

假设您在两者中都有root_dirroot_dir/sub_dir和源文件。有了target_sources你可以这样做:

root_dir/CMakeLists.txt定义目标

add_library(some_target main.cpp)
add_subdirectory(sub_dir)
Run Code Online (Sandbox Code Playgroud)

root_dir/sub_dir/CMakeLists.txt添加来源:

target_sources(some_target PRIVATE more_cool_stuff.cpp)
Run Code Online (Sandbox Code Playgroud)

some_target 现在将包含两个源文件。

也可以在root_dir/sub_dir/CMakeLists.txtusing 中使用其他命令some_target,例如target_compile_definitions添加编译定义非常方便。

我在这里了解到target_sources ,如果您需要更多解释和示例,请查看


arr*_*owd 6

你不能在 project/source/CMakelists.txt 中设置你的所有源代码吗?

无论如何,您需要的是set command上的PARENT_SCOPECACHE选项。