CMake включает библиотеку в другую библиотеку - PullRequest
0 голосов
/ 20 июня 2020

У меня есть заданная структура проекта

.
├── CMakeLists.txt
├── lib
│   ├── lodepng
│   │   ├── CMakeLists.txt
│   │   └── src
│   │       ├── lodepng.cpp
│   │       └── lodepng.h
│   └── pixel_reader
│       ├── CMakeLists.txt
│       └── src
│           ├── hello.cpp
│           └── hello.h
├── main.cpp

со следующими CMakeLists

. / CMakeLists.txt

cmake_minimum_required(VERSION 3.17)
project(pov_system VERSION 1.0)

add_subdirectory(lib/lodepng)
add_subdirectory(lib/pixel_reader)

add_executable(pov_system main.cpp)

target_link_libraries(pixel_reader PRIVATE lodepng)
target_link_libraries(pov_system PRIVATE pixel_reader)

. / Lodepng / CMakeLists.txt

add_library(
    lodepng
    src/lodepng.cpp
    src/lodepng.h
)

target_include_directories(lodepng PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")

. / Pixel_reader / CMakeLists.txt

add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")

Как один Как видите, я пытаюсь связать библиотеку lodepng с библиотекой pixel_reader и включить lodepng.h в файл hello.h. Но на данный момент я получаю следующую ошибку при попытке собрать проект.

[build] <path-to-project>/pov_system/lib/pixel_reader/src/hello.h:2:10: fatal error: lodepng.h: No such file or directory
[build]     2 | #include "lodepng.h"
[build]       |          ^~~~~~~~~~~
[build] compilation terminated.

Вопрос

Почему мой код не находит 'lodepng.h' файл или (что еще более важно) является ли хорошей практикой связывание одной библиотеки с другой?

Может быть, два действительно простых вопроса, но мы только начали погружаться в мир CMake, Compiling и т. д. c ... и я очень признателен за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Почему мой код не находит файл 'lodepng.h' или (что еще более важно)

Потому что вы, вероятно, не указали ему правильный путь. Один из способов исправить это - указать точный путь в hello.h

#include "../../lodepng/src/lodepng.h

Второй способ - использовать target_include_directories:

target_include_directories(pixel_reader PUBLIC "../../lodepng/src/")

это хорошая практика линковать одну библиотеку к другой?

Это зависит от вашего проекта. Если для библиотеки A требуется библиотека B, тогда да, на мой взгляд, это нормально.

Что еще более важно, вы создаете цель не в том месте, то есть в файле root CMakeLists . Это необходимо сделать в каталоге, в котором создана цель.

. / Pixel_reader / CMakeLists.txt

# create target
add_library(
    pixel_reader SHARED
    src/hello.cpp
    src/hello.h
)

target_link_libraries(pixel_reader PRIVATE lodepng) #link library where target is created
target_include_directories(pixel_reader PUBLIC "../../lodepng/src/")

target_include_directories(pixel_reader PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/src")
0 голосов
/ 20 июня 2020

Ваша цель библиотеки pixel_reader, возможно, нуждается в заголовке lodepng.h для компиляции, потому что это зависит от него.

что-то вроде

target_include_directories(pixel_reader PUBLIC "PATH_TO_LODE_PNG_HEADER_DIRECTORY")

могло бы решить эту проблему.

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