include_directories无法正常工作

时间:2015-03-10 15:41:37

标签: c++ cmake

我正在尝试使用ExternalProject_Add在this example中设置我的库和项目。

我有一个像这样的图书馆:

lib
|-include
| |-a.hpp
|-src
| |-a.cpp
|-CMakeLists.txt

使用以下CMakeLists.txt:

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)

我的项目如下:

app
|-src
| |-main.cpp
|-CMakeLists.txt

使用以下CMakeLists.txt:

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中的.a文件和contrib/TestLib/include中的.hpp文件

但是在我的main.cpp中,我不能在<TestLib/a.hpp>中添加a.hpp,它只适用于"../contrib/TestLib/include/a.hpp"<a.hpp>

如何将其与<TestLib/a.hpp>一起包含?

3 个答案:

答案 0 :(得分:3)

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

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>如果a.hpp不在子目录TestLib中,则不能ExternalProject_Add )。如果这是一个问题,您可能需要在{{1}}调用中添加一个安装步骤,并从安装目标目录而不是源目录中包含。

答案 1 :(得分:2)

我认为CMake目前存在一个错误。见saying

答案 2 :(得分:0)

(关注@CosmicSansMS和@ user1427799,对不起,我不允许发表评论...)

bug report中所建议的那样,“导入的目标包括不存在的路径”的一种解决方法是使用file (MAKE_DIRECTORY)手动创建文件夹。以下对我有效,适用于CMake 3.10.2:

set (__include "${PROJECT_SOURCE_DIR}/contrib/TestLib/include")

file (MAKE_DIRECTORY ${__include})
set_property (TARGET monoengine PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${__include})