Создание библиотеки с исполняемым файлом, который ее использует

У меня есть библиотека "lib" и исполняемая "демо".

Проблема, с которой я сталкиваюсь, заключается в том, что «демо» не может получить переменные lib_INCLUDES и lib_LIBS lib, установленные «lib». Я хочу, чтобы они были установлены, потому что в demo.h я делаю #include <lib.h> и не могу найти включение. Я хочу, чтобы CMake сделал lib.h глобальным включением, т.е. передал -I /path/to/the/dir/with/lib.h/ компилятору.


Исходное дерево:

- src/
  - CMakeLists.txt
  - lib/
    - CMakeLists.txt
    - lib.cpp
    - lib.h
  - demo/
    - CMakeLists.txt
    - demo.cpp
    - demo.h

источник/CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(test)

add_subdirectory(lib)
add_subdirectory(demo)

источник/lib/CMakeLists.txt

add_library(lib SHARED lib.h lib.cpp)
target_include_directories(lib ${CMAKE_CURRENT_SOURCE_DIR})

# defined for later use in src/demo/CMakeLists.txt
set(lib_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR})
set(lib_LIBS lib)

источник/демо/CMakeLists.txt

include_directories(${lib_INCLUDES})
add_executable(demo demo.h demo.cpp)
target_link_libraries(demo ${lib_LIBS})

# empty! why?
message(STATUS ${lib_INCLUDES})

Подскажите как "демо" может получить доступ к библиотекам lib_INCLUDES и lib_LIBS установленным "lib", в src/demo/CMakeLists.txt они вроде как пустые.

Я не хочу, чтобы src/demo/CMakeLists.txt содержал пути к "lib", только src/lib/CMakeLists.txt должен знать детали "lib", и он должен определять приятные переменные для использования в src/demo/CMakeLists.txt, которые скрывают все эти детали.

Если возможно, включите в свой ответ работающий файл CMakeLists.txt.


person John Berger    schedule 04.11.2014    source источник


Ответы (1)


Пожалуйста, внимательно прочитайте документацию по команде SET. Ваша переменная lib_INCLUDES имеет локальную область действия для lib\CMakeLists.txt, поэтому, например, вы можете ее КЭШИРОВАТЬ.

Лучший способ - заполнить INTERFACE_INCLUDE_DIRECTORIES из lib с помощью

target_include_directories(lib INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

поэтому target_link_libraries автоматически добавляет каталоги lib.

person Peter    schedule 04.11.2014