CMake не включает путь к ссылочным библиотекам при компиляции - PullRequest
0 голосов
/ 01 апреля 2020

Таким образом, моя структура каталогов выглядит как

/
-- CMakeLists.txt

-- bencode/
---- bType.hpp
---- bType.cpp
---- Decoder.hpp
---- Decoder.cpp
---- CMakeLists.txt

-- torrent/
---- main.cpp
---- Torrent.hpp
---- Torrent.cpp
---- Tracker.hpp
---- Tracker.cpp
---- CMakeLists.txt

. root CMakeLists.txt -

cmake_minimum_required(VERSION 3.16)
project(Torrent VERSION 1.0.0)
add_subdirectory(bencode)
add_subdirectory(torrent)

. Bencode / CMakeLists.txt -

add_library(
    Decoder
    Decoder.hpp
    Decoder.cpp
)
add_library(
    bType
    bType.hpp
    bType.cpp
)
target_include_directories(bType PRIVATE "${CMAKE_CURRENT_SOURCE/_DIR}")
target_include_directories(Decoder PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")

Torrent / CMakeLists.txt - это

add_library(
    Torrent
    Torrent.hpp
    Torrent.cpp
)
add_library(
    Tracker
    Tracker.hpp
    Tracker.cpp
)
add_executable(main main.cpp)
target_link_libraries(
    main PRIVATE
    Torrent Tracker
    Decoder bType
)

Всякий раз, когда я строю, компиляция Torrent.cpp завершается неудачно, так как включает Decoder.hpp, который не находится в том же каталоге, а команда построения не включает путь во время компиляции

[build] ../torrent/Torrent.cpp:5:10: fatal error: Decoder.hpp: No such file or directory
[build]  #include <Decoder.hpp>
[build]           ^~~~~~~~~~~~~
[build] comp

При компиляции должен был быть флаг -I, но его нет.

Помогите выяснить, почему?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

Если вы установите местоположение Decoder.hpp как publi c, включите каталог Decoder и используете target_link_libraries, чтобы связать Torrent с Decoder, CMake подхватит что вам нужно Torrent для поиска нужных мест, чтобы найти заголовки Docoder.

0 голосов
/ 01 апреля 2020

Вы связали все цели библиотеки с main, но если существует зависимость между библиотекой Torrent и Decoder, вам следует link Decoder до Torrent также. Чтобы распространить каталоги включения библиотеки Decoder в библиотеку Torrent, используйте аргумент PUBLIC в вызове target_include_directories().

bencode / CMakeLists.txt :

add_library(
    Decoder
    Decoder.hpp
    Decoder.cpp
)
add_library(
    bType
    bType.hpp
    bType.cpp
)
target_include_directories(bType PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
# Use PUBLIC here to propagate the include directories to consumers.
target_include_directories(Decoder PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")

torrent / CMakeLists.txt :

add_library(
    Torrent
    Torrent.hpp
    Torrent.cpp
)
add_library(
    Tracker
    Tracker.hpp
    Tracker.cpp
)
add_executable(main main.cpp)

# Link Decoder to Torrent here, because Torrent depends on Decoder.
target_link_libraries(Torrent PUBLIC Decoder)

# Link the other libraries to main, Decoder will be brought along with Torrent.
target_link_libraries(
    main PRIVATE
    Torrent 
    Tracker
    bType
)
...