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链接。这些都没有成功。实现这一目标的正确方法是什么,因为我认为我可能接近这个完全错误。
答案 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放在每个级别以使结构更易于管理,例如。每个目录只需知道它需要做什么(可能是该目录中的文件)。