Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用CMake的一个可执行文件的多个源目录_Cmake_Subdirectory - Fatal编程技术网

使用CMake的一个可执行文件的多个源目录

使用CMake的一个可执行文件的多个源目录,cmake,subdirectory,Cmake,Subdirectory,我希望我的源代码组织在多个子目录中,但能够创建单个可执行文件,而不必为每个子目录构建库。我能做到吗?比如: 添加可执行文件(foo a/main.cpp a/other.cpp b/other.cpp) 有那么简单吗?使用/作为目录分隔符,而不考虑平台?是的,这将起作用 更新:下面的内容不再重要,因为现在CMake支持响应文件,所以命令行太长应该不会有问题 但是,当文件数量太多,并且命令行太长,编译器无法处理时,您可能会遇到问题。一种可能的解决方案是为每个子目录添加一个静态库,将它们添加到“AL

我希望我的源代码组织在多个子目录中,但能够创建单个可执行文件,而不必为每个子目录构建库。我能做到吗?比如:

添加可执行文件(foo a/main.cpp a/other.cpp b/other.cpp)

有那么简单吗?使用/作为目录分隔符,而不考虑平台?

是的,这将起作用

更新:下面的内容不再重要,因为现在CMake支持响应文件,所以命令行太长应该不会有问题

但是,当文件数量太多,并且命令行太长,编译器无法处理时,您可能会遇到问题。一种可能的解决方案是为每个子目录添加一个静态库,将它们添加到“ALL_MY_SUB_LIBS”列表中,并通过以下方式将它们链接到主目标foo:

target_link_libraries(foo "-Wl,--whole-archive") #like opening a parenthesis
target_link_libraries(foo ${ALL_MY_SUB_LIBS}) 
target_link_libraries(foo "-Wl,--no-whole-archive") #like closing a parenthesis

这里是我的简单示例

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(foo CXX)
# get all *.cpp files recursively
file(GLOB_RECURSE SRC_FILES ${PROJECT_SOURCE_DIR}/*.cpp)
add_executable(foo ${SRC_FILES})
另一种变体(对于大型代码库来说可能更好)是为每个子目录使用单独的
CMakeLists.txt
,在子目录中,使用
target\u sources
将目录的源添加到目标,可能一些特定的配置设置\包括这些源的条件:

target_sources( SomeExeOrLib PRIVATE source1.h source1.cpp )

在这里,您还可以通过指定
PRIVATE
对范围进行更多控制,其他选项有
INTERFACE
PUBLIC
。请参阅此处的详细信息:

是的,应该可以。是的,我想没有真正的理由不为每个子目录构建一个库,尽管我预计不会有大量的源代码。我只是觉得管理一个顶级的CMakeLists.txt会更容易,而不是为每个子目录管理一个,所有子目录都90%相同。分组的主要原因是一些特定于平台的文件,一些需要不同的标志等。实际上,在我的案例中,有一个很好的理由不使用库;两个目录都是相互依赖的,链接器无法处理这一点。否则,除了CMake新手的出牙问题外,这确实有效。@reah你试过了吗?我们正在我们的一个项目中使用这种技术,帮助程序库之间有很多依赖关系,但是链接到整个归档文件可以很好地处理它。@真的,你也可以检查这个,你可以为编译器打开另一个括号:)(不管怎样,我重复一遍,我怀疑这在这种情况下是必要的)@Antonio。你好我试图在我的子目录cmakelist.txt中使用您的解决方案,因为父目录是foo,但我的子目录的cmakelist.txt抱怨说“尝试添加链接库”-Wl,--整个归档文件”以目标“foo”,而该“foo”不在此目录中生成。“我在父目录中缺少什么吗?”。?Thnx是否需要此
CXX
(第二行)?我可以只使用
project(foo)
吗?@thiagowfx是的,它是可选的-参考我们可以用:add_executable(openshell${SOURCES}替换最后一行吗?很好的建议。我已经找到了一个教程,其中对细节进行了很好的解释。