我喜欢在多个子目录中构建我的代码,但我不想在每个新的子目录中创建一个新的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执行后创建的源文件,如果使用它们,则构建失败 . 由GLOB部分http://www.cmake.org/cmake/help/v3.0/command/file.html预测:
我们不建议使用GLOB从源树中收集源文件列表 . 如果在添加或删除源时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时请求CMake重新生成 .
问题:是否可以将单个cmakelist.txt用于具有多个子目录的项目? (没有文件问题(GLOB ......))
2 回答
你这里有两件完全不相关的东西 .
首先,您是否只能为整个项目使用一个CMakeLists.txt文件?是的,当然你可以(虽然我个人不会在项目达到一定规模后这样做),而你已经这样做了 .
第二,GLOB的问题 . 您已经引用了文档的一部分,其中说明了GLOB的使用存在的问题 . 如果您想继续使用GLOB,目前无法避免这种情况,因为这是cmake设计的一部分,它们区分配置和构建时间内完成的工作 . 另一种方法是手动列出所有文件 . 无论是在项目主目录中的单个CMakeLists.txt文件中执行此操作,还是在子目录中的多个文件中执行此操作都无关紧要 .
回答你的问题:是的,可以处理一个包含多个子目录和一个CMakeLists.txt的项目 . 我有两个考虑因素需要考虑:
我强烈建议您不要使用
file(GLOB ...)
作为来源 .您必须手动列出文件 . 例如(
src/
是source-subdirectory):set(cpps src / file1.cpp src / file2.cpp src / file3.cpp)