2016-12-30 9 views
1

У меня возникла проблема с проектом CMake со статической библиотекой. Мой проект strucutre выглядит следующим образом:Включить файлы заголовков из статической библиотеки с CMake

Foo/ 
|-- CMakeLists.txt 
|-- lib/ 
    |-- CMakeLists.txt 
    |-- libA/ 
     |-- CMakeLists.txt 
     |-- libA.cpp 
     |-- libA.h 
     |-- libAB.h 
|-- src/ 
    |-- CMakeLists.txt 
    |-- main.cpp 
    |-- srcDirA/ 
     |-- CMakeLists.txt 
     |-- srcA.h 
    |-- srcDirB/ 
     |-- CMakeLists.txt 
     |-- srcB.cpp 
     |-- srcB.h 

И */CMakeLists.txt выглядеть:

Foo/CMakeLists.txt:

cmake_minimum_required(VERSION 3.5.1) 
project(FOO) 

set(CMAKE_CXX_STANDARD 11) 

add_subdirectory(lib) 
add_subdirectory(src) 

Foo/Библиотека/CMakeLists.txt :

add_subdirectory(libA) 

Foo/Библиотека/Либа/CMakeLists.txt:

add_library (staticLibA STATIC libA.cpp) 

Foo/SRC/CMakeLists.txt:

add_subdirectory(srcDirA) 
add_subdirectory(srcDirB) 
include_directories(".") 

add_executable(foo main.cpp) 
target_link_libraries(foo LINK_PUBLIC libA) 

Foo/SRC/srcDirA/CMakeLists.txt пуст

Foo/SRC/srcDirB/CMakeLists.txt пуст

Теперь я пытаюсь включить заголовок из моей статической библиотеки в свой основной проект следующим образом:

Foo/src/main.cpp:

#include "srcDirB/srcB.h" 
#include "libA/libA.h" 

int main() { 
    //... 
    return 0; 
} 

Если я пытаюсь построить это с CMake, Либа генерируется, но я получаю фатальную ошибку:

libA/libA.h: No such file or directory.

Кто-нибудь знает, что я делаю неправильно? У меня есть create a ProjectConfig.cmake file?

ответ

1

Вам не нужно создавать файлы Config; они предназначены для импорта сторонних проектов.

Поскольку вы используете CMake> = 3.5.1, вы можете задать usage requirements для своих библиотек. Требования к использованию - это такие вещи, как флаги, или включают в себя каталоги, которые клиенты должны создавать с помощью библиотеки.

Так в Foo/Lib/Либе/CMakeLists.txt :, вы будете делать это:

add_library (staticLibA STATIC libA.cpp) 
target_include_directories(staticLibA INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/..) 

Или, если вы хотите такое же включать каталог обратиться к самому Либу (что вероятно), используйте PUBLIC вместо INTERFACE.

Это все, что вам действительно нужно делать. Однако, учитывая современный CMake, который вы используете, вы должны заменить свое использование ключевого слова legacy LINK_PUBLIC его современным эквивалентом PUBLIC.

Кроме того, поскольку вы упоминаете оба CMakeLists в .../srcDir*, пустые, зачем их там в первую очередь? Вы можете легко избавиться от них и связанных с ними звонков add_subdirectory.