我的项目没有被分成库,但源是在目录树中组织的。我不知道如何告诉cmake进入目录,然后将该目录中的源添加到父目录中定义的项目。我尝试了以下方法:
项目/来源/ CMakelists.txt中的:
set(SOURCE
${CMAKE_CURRENT_SOURCE_DIR}/unitTest/main.cpp
)
add_subdirectory("${PROJECT_SOURCE_DIR}/folder1")
add_executable(UnitTestRNG ${SOURCE} ${HEADERS})
然后在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
)
使用一些message()语句,我发现子文件夹将获取SOURCE变量的内容,但是对该变量的新赋值将不会在返回到父CMakeLists.txt时保留
寻找示例并在cmake教程中得出结论: - 源文件结构通常在项目中是平的 - 如果代码被分成文件夹,通常会将其分成相应的库。
我想知道是否有一些“最佳实践”,我通过尝试这种结构而偏离它。
答案 0 :(得分: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
)
答案 1 :(得分:4)
您是否只能在project / source / CMakelists.txt中设置所有来源?
无论如何,您需要的是set command上的PARENT_SCOPE
或CACHE
选项。
答案 2 :(得分:2)
从CMake 3.1开始,有一种新方法可从子目录添加源:target_sources
假设您都有root_dir和root_dir / sub_dir以及源文件。使用target_sources,您可以执行以下操作:
在root_dir / CMakeLists.txt中定义目标
add_library(some_target main.cpp)
add_subdirectory(sub_dir)
在root_dir / sub_dir / CMakeLists.txt中添加源:
target_sources(some_target PRIVATE more_cool_stuff.cpp)
some_target 现在将同时包含两个源文件。
还可以使用 some_target 在root_dir / sub_dir / CMakeLists.txt中使用其他命令,例如target_compile_definitions,这很方便。
我了解了target_sources here, check it out if you want more explanation and examples