如何使用CMake从根文件夹外部添加包含目录?

时间:2016-02-07 20:46:38

标签: c++ cmake

这是我的第一个CMakeLists.txt代码:

#cmake_minimum_required (VERSION 2.6)
project (project)

add_subdirectory(src)

include_directories(${/path_to_directory}/include)

这是子目录中的CMakeLists.txt

set (CMAKE_C_FLAGS "-WALL -g")

file(GLOB SRCS *.cpp *.hpp *.h)

add_executable(source ${SRCS})

我仍然无法在项目中包含path_to_directory

编辑:这也不起作用:

file(GLOB mylib *.cpp *.hpp *.h)

add_executable(includeSource ${mystuff})
target_include_directories(
    mystuff
    PUBLIC ${path_to_directory}/include
)

2 个答案:

答案 0 :(得分:1)

即使问题不明确,我想您需要target_include_directorieshere文档)而不是include_directories

来自文档:

  

指定编译给定目标时要使用的包含目录或目标。

您可以将其用作:

target_include_directories(
    your_target_name
    PUBLIC ${/path_to_directory}/include
)

答案 1 :(得分:1)

根据您的前两个代码,我了解您的可执行文件source无法编译,因为您的编译器找不到${/path_to_directory}/include中的包含文件。

根据这个假设,我可以说你错放了include_directories(${/path_to_directory}/include),它应该在子目录的CMakeLists.txt中。

documentation of include_directories将帮助您理解:

  

include目录被添加到当前CMakeLists文件的INCLUDE_DIRECTORIES目录属性中。它们还会添加到当前CMakeLists文件中每个目标的INCLUDE_DIRECTORIES目标属性中。目标属性值是生成器使用的值。

否则,您可以将主CMakeLists.txt中的include_directories(${/path_to_directory}/include)替换为@ target_include_directories(source PUBLIC ${/path_to_directory}/include) @skypjack建议。它会影响子目录的CMakeLists.txt中的源目标。

附加评论和建议

  1. 您想要编译c ++源文件,但您要定义CMAKE_C_FLAGS而不是CMAKE_CXX_FLAGS。

  2. 如果您之前设置了CMAKE_C_FLAGS,则
  3. set (CMAKE_C_FLAGS "-Wall -g")会很危险。首选set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g")

  4. file(GLOB ...)不建议查找源文件。 See the documentation

  5.   

    我们不建议使用GLOB从源树中收集源文件列表。如果在添加或删除源时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时要求CMake重新生成。

    1. 如果您的主CMakeLists.txt与您展示的一样简单,add_subdirectory就没用了。您只能在一个主CMakeLists.txt
    2. 中执行所有操作