Связывание двух библиотек вместе с CMake - PullRequest
0 голосов
/ 09 апреля 2020

Структура файла:

CMakeLists.txt
src/
    evolution.cpp
    evolution.h
    main.cpp
    helpers/
        disposable.h
    engine/
        game.h
        game.cpp

CMakeLists.txt:

cmake_minimum_required(VERSION 3.17)
project(evolution)

add_library(helpers
    src/helpers/disposable.h)
set_target_properties(helpers PROPERTIES LINKER_LANGUAGE CXX)

add_library(engine
    src/engine/game.h
    src/engine/game.cpp)

add_executable(evolution src/main.cpp)

target_link_libraries(evolution engine helpers)

Класс Game (game.h) наследуется от Diposable (disposable.h), но Я не могу собрать проект с простым #include "disposable.h" в файле game.h.

Как настроить CMake так, чтобы библиотека engine могла видеть библиотеку helpers?

Ошибка CMake:

[ 20%] Building CXX object CMakeFiles/engine.dir/src/engine/game.cpp.o
In file included from /home/shane/projects/evolution/src/engine/game.cpp:1:
/home/shane/projects/evolution/src/engine/game.h:4:10: fatal error: disposable.h: No such file or directory
    4 | #include "disposable.h"
      |          ^~~~~~~~~~~~~~
compilation terminated.

1 Ответ

1 голос
/ 09 апреля 2020

Добавление заголовков в проект действительно только помогает IDE находить заголовки. Это не меняет инструкции по сборке. Вместо этого вам нужно использовать target_include_directories() с разделом INTERFACE или PUBLIC, чтобы получить любые библиотеки, которые ссылаются на него, чтобы добавить к себе включаемые каталоги.

Ваша библиотека помощников на данный момент является скорее интерфейсом , Чтобы этот минимальный пример работал, сделайте следующее:

cmake_minimum_required(VERSION 3.17)
project(evolution)

add_library(helpers INTERFACE) # INTERFACE is good for header-only libraries
target_include_directories(helpers INTERFACE src/helpers) 

add_library(engine
    src/engine/game.h
    src/engine/game.cpp)

add_executable(evolution src/main.cpp)

target_link_libraries(evolution engine helpers)

Теперь включите в angular скобки: #include <disposable.h>

Если ваша библиотека становится более сложной (чем просто заголовочные файлы), тогда замените INTERFACE в add_library вашими источниками. Чтобы сделать включаемые каталоги доступными для библиотеки helpers и любой библиотеки, которая на нее ссылается, измените INTERFACE на PUBLIC в target_include_directories.

cmake_minimum_required(VERSION 3.17)
project(evolution)

add_library(helpers src/helpers/helper.cpp)
target_include_directories(helpers PUBLIC src/helpers)

add_library(engine
    src/engine/game.h
    src/engine/game.cpp)

add_executable(evolution src/main.cpp)

target_link_libraries(evolution engine helpers)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...