gpt4 book ai didi

cmake - 如何从 CMakeLists.txt 文件设置 include_directories?

转载 作者:行者123 更新时间:2023-12-03 22:08:07 26 4
gpt4 key购买 nike

我似乎在使用 -I 设置包含路径( include_directories() )时遇到问题CMake 中的命令。我的项目目录如下:

Root
| - CMakeLists.txt
| - libs
| - | - CMakeLists.txt
| - | - inc
| - | - | - // lib specific includes
| - | - src
| - | - | - // lib specific sources
| - proj1
| - | - CMakeLists.txt
| - | - inc
| - | - | - // proj1 specific includes
| - | - src
| - | - | - // proj1 specific sources

CMakeLists.txt文件看起来像这样:
project(ROOT)
add_subdirectory(libs)
add_subdirectory(proj1)
CMakeLists.txt文件下 libs :
project(lib)
add_library(lib STATIC ${lib_hdrs} ${lib_srcs}) // for conciseness, omitted set()

最后, CMakeLists.txt文件下 proj1 :
project(proj1)

include_directories("${ROOT_SOURCE_DIR}/lib/inc") # <- problem line?

add_executable(proj1 ${proj1_srcs})
target_link_libraries(proj1 lib)

目标是从 libs 中的源文件和头文件创建库,然后链接到在 proj1 下生成的可执行文件。 Proj1 有一些文件 #include libs中的东西包括,所以我需要添加要与 -I一起使用的目录.根据文档,这就是 include_directories()应该做。然而,尽管明确设置并跟随它进行调试 message(${INCLUDE_DIRECTORIES}) , INCLUDE_DIRECTORIES variable 是一个空字符串,并且没有为包含路径指定目录,所以我编译 proj1 失败。

我也尝试删除 ${ROOT_SOURCE_DIR}/inc 周围的引号看看这是否有帮助,但没有运气。

最佳答案

include_directories()填充名为 INCLUDE_DIRECTORIES 的目录属性:

http://www.cmake.org/cmake/help/v2.8.12/cmake.html#prop_dir:INCLUDE_DIRECTORIES

请注意,CMake 2.8.11 学习了 target_include_directories命令,填充 INCLUDE_DIRECTORIES目标属性(property)。
http://www.cmake.org/cmake/help/v2.8.12/cmake.html#command:target_include_directories

另请注意,您可以对“针对 lib 的头文件进行编译”这一事实进行编码。目标,包含目录 lib/inc需要'进入 lib使用 target_include_directories 定位自身与 PUBLIC关键词。

add_library(lib STATIC ${lib_hdrs} ${lib_srcs}) # Why do you list the headers?
target_include_directories(lib PUBLIC "${ROOT_SOURCE_DIR}/lib/inc")

另请注意,我假设您没有安装 lib供他人使用的库。在这种情况下,您需要为构建位置和安装位置指定不同的头目录。
target_include_directories(lib
PUBLIC
# Headers used from source/build location:
"$<BUILD_INTERFACE:${ROOT_SOURCE_DIR}/lib/inc>"
# Headers used from installed location:
"$<INSTALL_INTERFACE:include>"
)

无论如何,这仅在您安装 lib 时才重要。供他人使用。

target_include_directories(lib ...)上面你不需要另一个 include_directories()称呼。 lib target '告诉' proj1 它需要使用的包含目录。

另见 target_compile_defintions() target_compile_options() .

关于cmake - 如何从 CMakeLists.txt 文件设置 include_directories?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19460707/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com