我想在多个子目录中构建我的代码,但我不想在每个新的子目录中创建一个新的cmakelist.txt。
我的文件夹结构是这样的:
project
>cmakelist.txt
>build
>src
>main.cpp
>multiple_subdirs_or_(c|h)pp_files_with_more_subdirs_or_(c|h)pp_files
我的cmakelist.txt看起来像这样:
...
file(GLOB_RECURSE cpps RELATIVE ${CMAKE_CURRENT_LIST_DIR} "src/*.cpp")
file(GLOB_RECURSE hpps RELATIVE ${CMAKE_CURRENT_LIST_DIR} "src/*.hpp")
#remove files with main
list(REMOVE_ITEM cpps "src/test.cpp")
#bins
add_executable(test src/test.cpp src/test.cpp ${hpps} ${cpps})
#same problem if this is used instead of the other add_executable
add_library(foo OBJECT ${cpps} ${hpps})
add_executable(test src/test.cpp $<TARGET_OBJECTS:foo>)
我的档案问题:
执行cmake后创建的源文件未编译,如果使用它们,则构建失败。 正如http://www.cmake.org/cmake/help/v3.0/command/file.html在GLOB节中预测的那样:
我们不建议使用GLOB从中收集源文件列表 你的源代码树。如果源没有更改CMakeLists.txt文件 添加或删除然后生成的构建系统无法知道何时 让CMake重新生成。
问题:是否可以将单个cmakelist.txt用于具有多个子目录的项目? (没有文件问题(GLOB ...))
答案 0 :(得分:4)
回答你的问题:是的,可以处理一个包含多个子目录和一个CMakeLists.txt的项目。我有两个考虑因素需要考虑:
file(GLOB ...)
作为来源。您必须手动列出文件。例如(src/
是source-subdirectory):
set(cpps src / file1.cpp src / file2.cpp src / file3.cpp)
答案 1 :(得分:4)
这里有两件完全不相关的东西。
首先,您是否只能为整个项目使用一个CMakeLists.txt文件?是的,当然你可以(虽然我个人在项目达到一定规模后不会这样做),而且你已经这样做了。
第二,GLOB的问题。您已经引用了文档的一部分,其中说明了GLOB的使用存在的问题。如果您想继续使用GLOB,目前无法避免这种情况,因为这是cmake设计的一部分,它们区分配置和构建时间内完成的工作。另一种方法是手动列出所有文件。无论是在项目主目录中的单个CMakeLists.txt文件中执行此操作,还是在子目录中的多个文件中执行此操作都无关紧要。