使用子目录添加库

时间:2017-02-19 00:14:14

标签: c++ cmake

TL; DR

使用CMake,如何将子目录包含到库中,以便可以包含它们而不引用它们所在的目录?

结束TL; DR

为了简明扼要,并在更高层次上谈论什么和如何,我已经删除了我认为不必要的细节。如果需要,我会进行编辑。因此,这是我的项目结构的简要概要。

ParentDir
--src
----source.cpp
----source.h
----entities_dir
------entity.cpp
------entity.h
------CMakeLists.txt
----CMakeLists.txt
--CMakeLists.txt
--main.cpp

目前看来,我有一个由src目录中的CMakeLists定义的库。因此,我可以通过#include将src文件包含在#include“src / file.h”中。我希望能够对src子目录中存在的标题执行相同的操作。

的CMakeLists.txt

cmake_minimum_required(VERSION 3.6)
project(Project) 

add_executable(Project ${SOURCE_FILES} main.cpp)
include_directories(src)
add_subdirectory(src)
target_link_libraries(Project Library) # Engine Libraries

的src /的CMakeLists.txt

file(GLOB SOURCE_FILES *.cpp)
file(GLOB HEADER_FILES *.h)

add_library(Library STATIC ${SOURCE_FILES} ${HEADER_FILES})

的main.cpp

#include <source.h> // this works
#include <entity.h> // this does not work but I want it to
#include <entities/entity.h> // this works but I don't want this
int main() {}

我不确定如何做到这一点。我已经尝试过GLOB_RECURSE,add_subdirectory(实体)等。我还尝试在src / entities / CMakeLists.txt中创建一个名为Entities的库,并将其与link_libraries链接。这些都没有成功。实现这一目标的正确方法是什么,因为我认为我可能接近这个完全错误。

2 个答案:

答案 0 :(得分:1)

您需要在编译器标头搜索路径中使用该路径,这是通过include_directories()调用实现的。您可以将现有的include_directories(src)调用修改为:

include_directories(src src/entities)

此外,这篇SO帖子是相关的,值得一读:Recursive CMake search for header and source files。 CMake网站本身有一个摘录,建议不要使用文件(GLOB ...),这有助于推荐一般的递归解决方案。作为CMake的重度用户,我同意反对它的观点。

答案 1 :(得分:0)

你只需要添加:

include_directories(${CMAKE_CURRENT_LIST_DIR})

在您的层次结构中的每个CMakeLists.txt中。

CMake本身并不编译您的项目,它只调用您的工具链并将参数传递给它,而您的工具链并不知道&#39;它是由CMake调用的,或者是项目的结构。因此,您需要告诉工具链在哪里找到包含文件。

虽然在每个子目录中都有一个CMakeLists.txt很常见,但这绝不是必需的。 src目录中的CMakeLists.txt可以包含生成构建所需的所有指令。通常,CMakeLists.txt放在每个级别以使结构更易于管理,例如。每个目录只需知道它需要做什么(可能是该目录中的文件)。