如何在CMake中从根目录之外添加包含目录?

4
这是我的第一个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})

我仍然无法在我的项目中包含路径到目录

编辑:这也不起作用:

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

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

你是不是想说${path_to_include}/include而不是${/path_to_include}/includemessage("${path_to_include}")会显示什么?在执行include_directories之后,message("${INCLUDE_DIRECTORIES}")会显示什么? - James Adkison
2个回答

1
即使问题不是很清楚,我猜你想要的是target_include_directories这里是文档),而不是include_directories
根据文档:
指定编译给定目标时要使用的包含目录或目标。
你可以这样使用它:
target_include_directories(
    your_target_name
    PUBLIC ${/path_to_directory}/include
)

我显然做错了。我尝试了以下代码: file(GLOB mylib *.cpp *.hpp *.h) add_executable(includeSource ${mystuff}) target_include_directories( mystuff PUBLIC ${path_to_directory}/include ) - user3063750

1
根据您的前两个代码,我了解到您的可执行文件source无法编译,因为您的编译器无法从${/path_to_directory}/include中找到包含文件。
基于这个假设,我可以说您将include_directories(${/path_to_directory}/include)放错了位置,它应该在子目录的CMakeLists.txt中。 include_directories文档将帮助您理解:
“包含目录被添加到当前CMakeLists文件的INCLUDE_DIRECTORIES目录属性中。它们还被添加到当前CMakeLists文件中每个目标的INCLUDE_DIRECTORIES目标属性中。生成器使用的是目标属性值。”
否则,您可以按照@skypjack的建议,在主CMakeLists.txt中用target_include_directories(source PUBLIC ${/path_to_directory}/include)替换include_directories(${/path_to_directory}/include)。这将影响子目录的CMakeLists.txt中的源目标。

附加评论和建议

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

  2. set (CMAKE_C_FLAGS "-Wall -g") 如果您以前设置了CMAKE_C_FLAGS,则很危险。请使用 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -g")

  3. 不建议使用file(GLOB ...)查找源文件。请参阅文档

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

  1. 如果您的主要CMakeLists.txt与您显示的一样简单,则add_subdirectory是无用的。您可以仅在一个主要CMakeLists.txt中完成所有操作

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