我正在尝试使用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>
一起包含?
答案 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})