首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >include_directories不能正常工作

include_directories不能正常工作
EN

Stack Overflow用户
提问于 2015-03-10 15:41:36
回答 3查看 4.8K关注 0票数 3

我正在尝试使用这个例子设置我的库和项目,比如使用ExternalProject_Add。

我有一个这样的图书馆:

代码语言:javascript
复制
lib
|-include
| |-a.hpp
|-src
| |-a.cpp
|-CMakeLists.txt

使用以下CMakeLists.txt:

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.8.0)
project(testlib)
file(GLOB_RECURSE SRCS src/*.cpp; src/*.c)
add_library(TestLib STATIC ${SRCS})
install(TARGETS TestLib DESTINATION ${PROJECT_SOURCE_DIR}/lib)

我的项目如下:

代码语言:javascript
复制
app
|-src
| |-main.cpp
|-CMakeLists.txt

使用以下CMakeLists.txt:

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.8.11)
project(testapp)
file(GLOB_RECURSE SRCS src/*.cpp; src/*.c)
file(GLOB_RECURSE HDRS src/*.hpp; src/*.h)
include(ExternalProject)
ExternalProject_Add(
    TestLib
    PREFIX "contrib"
    DOWNLOAD_DIR "contrib"
    SOURCE_DIR "${PROJECT_SOURCE_DIR}/contrib/TestLib"
    URL "../../lib.zip"
)

add_library(monoengine STATIC IMPORTED)
set_property(TARGET monoengine PROPERTY IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/contrib/TestLib/lib/libTestLib.a)
add_dependencies(monoengine TestLib)

add_executable(TestApp ${SRCS} ${HDRS})

include_directories(${PROJECT_SOURCE_DIR}/contrib/TestLib/include/)
target_link_libraries(TestApp monoengine)

库安装正确,contrib/TestLib/lib中有contrib/TestLib/lib文件,contrib/TestLib/include中有.hpp文件

然而,在我的main.cpp中,我不能在<TestLib/a.hpp>中包括a.hpp,它只适用于"../contrib/TestLib/include/a.hpp"<a.hpp>

如何将它包含在<TestLib/a.hpp>中?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-10 16:00:55

可以将包含目录添加到导入目标的INTERFACE_INCLUDE_DIRECTORIES集合中。这样,当使用target_link_libraries添加依赖项时,您也会自动获得该依赖项的包含目录。请注意,此特性需要CMake 2.8.12或更高版本。

代码语言:javascript
复制
add_library(monoengine STATIC IMPORTED)
set_property(TARGET monoengine PROPERTY IMPORTED_LOCATION 
             ${PROJECT_SOURCE_DIR}/contrib/TestLib/lib/libTestLib.a)
set_property(TARGET monoengine PROPERTY INTERFACE_INCLUDE_DIRECTORIES
             ${PROJECT_SOURCE_DIR}/contrib/TestLib/include)

请注意,要使此操作有效,依赖项的源目录结构必须与包含目录结构匹配(也就是说,如果#include <TestLib/a.hpp>不在子目录TestLib中,则不能使用a.hpp )。如果这是一个问题,您可能需要在ExternalProject_Add调用中添加一个安装步骤,并从安装目标目录而不是源目录中包含安装步骤。

票数 3
EN

Stack Overflow用户

发布于 2016-01-31 15:26:35

我认为目前CMake中存在一个bug。请参阅https://cmake.org/Bug/view.php?id=15052

票数 2
EN

Stack Overflow用户

发布于 2019-03-04 16:50:21

(请访问@CosmicSansMS和@ up 1427799,对不起,不允许我发表评论.)

“导入目标包含不存在的路径”的解决方法是使用file (MAKE_DIRECTORY)手动创建文件夹,正如错误报告中所建议的那样。以下内容适用于我,使用CMake 3.10.2:

代码语言:javascript
复制
set (__include "${PROJECT_SOURCE_DIR}/contrib/TestLib/include")

file (MAKE_DIRECTORY ${__include})
set_property (TARGET monoengine PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${__include})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28967951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档