2015-03-10 2 views
3

Я пытаюсь настроить свою библиотеку и проект, как в this example, используя ExternalProject_Add.include_directories не работает правильно

У меня есть библиотека, как это:

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) 

библиотека становится установлен правильно, у меня есть файл .a в contrib/TestLib/lib и файл .hpp в contrib/TestLib/include

Однако в моей main.cpp я не могу включить a.hpp с <TestLib/a.hpp>, он работает только с "../contrib/TestLib/include/a.hpp" или <a.hpp>.

Как включить его с <TestLib/a.hpp>?

+1

Вы не получите '', чтобы работать, не помещая 'a.hpp' непосредственно в каталог' TestLib' где-то. – bames53

+0

@ bames53: Я просто понял это. Это было даже написано в другом ответе, который я получил на предыдущий вопрос. Я чувствую себя немым ... – gartenriese

ответ

3

Вы можете добавить каталог include к набору INTERFACE_INCLUDE_DIRECTORIES импортированной цели. Таким образом, при добавлении зависимости с target_link_libraries, вы автоматически получаете каталоги include для зависимости. Обратите внимание, что для этой функции требуется 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

Это не работает для меня, это говорит: «Импорт целевой« моножизни »включает несуществующий путь« какой-то путь »в его INTERFACE_INCLUDE_DIRECTORIES.'. Может быть, он пытается получить доступ к пути до его создания? – gartenriese

+0

Но я получил его, чтобы работать, тем не менее, с моим предыдущим подходом. Я должен был поставить свои заголовки в подкаталог, как вы говорили. Благодаря! – gartenriese