CMake子目录依赖

20

我对CMake非常陌生,实际上,我正在尝试通过Kdevelop4 widh C++使用它。

我有一个习惯,即为我创建的每个命名空间创建子目录,即使所有源代码都必须编译和链接到单个可执行文件中。当我在kdevelop下创建一个目录时,它将使用add_subdirectory命令更新CMakeLists.txt并在其下创建一个新的CMakeLists.txt,但这并不会将其中的源代码添加到编译列表中。

我有以下根CMakeLists.txt:

project(gear2d)
add_executable(gear2d object.cc main.cc)
add_subdirectory(component)

在component/下,我有我想要编译和链接以生成gear2d可执行文件的源代码。我该如何做到这一点?

CMake FAQ有这篇文章,但如果那是答案,我宁愿使用普通的Makefiles。

有没有办法做到这一点?

1个回答

24

添加一个子目录并没有太多作用,只是告诉CMake它应该进入该目录,并在那里查找另一个CMakeLists.txt。您仍然需要使用add_library创建带有源文件的库,并使用target_link_libraries将其链接到可执行文件中。像下面这样:

在子目录的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} )

顶级目录的 CMakeLists.txt

project( gear2d )
add_subdirectory( component )
add_executable( gear2d object.cc main.cc )
target_link_libraries( gear2d component )

搞定了!非常感谢。我对库的概念有其他想法,实际上我期望的只是像在根目录中使用add_executable一样,在子目录CMakeLists.txt中添加源代码。再次感谢。 - Leonardo
您先生,您让我不再一头撞在墙上。谢谢。 - winduptoy
2
我想建议将示例中的子目录“component”重命名为“componentdir”。这样可以明确表明target_link_libraries期望从子目录的CMakeLists.txt中获取目标名称“component”。由于这至少是我在网络上找到的第三个子目录和链接项具有相同名称的示例,我有点困惑,不得不自己尝试一下...(如果子目录名称也适用于target_link_libraries - 但它不行;顺便说一下,您也不能使用在子目录中定义的${...}别名...) - yau
感谢提供简单的解决方案!! - Kamble Tanaji
谢谢@yau - 你的评论救了我!我有一段时间非常困惑。 - Jon Nordby
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接