Dependencies CMake子目录依赖关系

Dependencies CMake子目录依赖关系,dependencies,cmake,subdirectory,Dependencies,Cmake,Subdirectory,我对CMake很陌生。事实上,我正在尝试通过KDeaveWIDH+C++。 我有为我创建的每个名称空间创建子目录的习惯,即使所有源代码都必须编译并链接到单个可执行文件中。好的,当我在kdevelop下创建一个目录时,它会用add_子目录命令更新CMakeLists.txt,并在它下面创建一个新的CMakeLists.txt,但这本身并不能将它下面的源添加到编译列表中 我的根CMakeLists.txt如下所示: project(gear2d) add_executable(gear2d obj

我对CMake很陌生。事实上,我正在尝试通过KDeaveWIDH+C++。 我有为我创建的每个名称空间创建子目录的习惯,即使所有源代码都必须编译并链接到单个可执行文件中。好的,当我在kdevelop下创建一个目录时,它会用add_子目录命令更新CMakeLists.txt,并在它下面创建一个新的CMakeLists.txt,但这本身并不能将它下面的源添加到编译列表中

我的根CMakeLists.txt如下所示:

project(gear2d) add_executable(gear2d object.cc main.cc) add_subdirectory(component) 项目(gear2d) 添加_可执行文件(gear2d object.cc main.cc) 添加_子目录(组件) 在component/I下,我有我想要编译和链接以生成gear2d可执行文件的源代码。我怎样才能做到这一点

CMake FAQ有条目,但如果这是答案,我宁愿使用普通的Makefiles


有什么方法可以做到这一点吗?

添加子目录只需向CMake指定它应该进入目录并在那里查找另一个CMakeLists.txt。您仍然需要使用创建包含源文件的库,并使用将其链接到可执行文件。如下所示:

在子目录CMakeLists.txt中

set( component_SOURCES ... ) # Add the source-files for the component here
# Optionally you can use file glob (uncomment the next line)
# file( GLOB component_SOURCES *.cpp )below

add_library( component ${component_SOURCES} )
project( gear2d )
add_subdirectory( component )
add_executable( gear2d object.cc main.cc )
target_link_libraries( gear2d component )
Top dir CMakeLists.txt

set( component_SOURCES ... ) # Add the source-files for the component here
# Optionally you can use file glob (uncomment the next line)
# file( GLOB component_SOURCES *.cpp )below

add_library( component ${component_SOURCES} )
project( gear2d )
add_subdirectory( component )
add_executable( gear2d object.cc main.cc )
target_link_libraries( gear2d component )

成功了!非常感谢。对于库的含义,我有其他的概念,事实上,我只是希望在subdir CMakeListrs.txt中添加源代码,就像在根目录中一样,使用add_可执行文件。再次感谢。这基本上增加了一个新的(库)目标。即使这个目标本身没有链接,在以后设置comiler标志或其他东西时可能会出现问题。。。更好的答案是:@kralyk:我同意图书馆的新目标。为了方便起见,我浏览了一下“链接到单个可执行文件”,只是想提示一下在目录和库上分发源文件的另一种方法。谢谢。我想添加将示例中的subdir“component”重命名为“componentdir”的建议。只是想说明一下,
target\u link\u库
希望目标名称“component”来自子目录的CMakeLists.txt。因为这至少是我在网上发现的第三个subdir和link项名称相同的示例,所以我有点困惑,不得不自己尝试一下。。。(如果subdir名称可能也适用于
target\u link\u库
,但它不适用;顺便说一下,您也不能使用subdir中定义的${…}别名…)