CMake: включить библиотеки в проект - PullRequest
0 голосов
/ 15 марта 2020

Я новичок в CMake и мне нужна помощь. Я пытаюсь разработать следующий cmaketutorial проект:

.
├── CMakeLists.txt
├── lib
│   ├── CMakeLists.txt
│   ├── lib1
│   │   ├── CMakeLists.txt
│   │   └── lib1.h
│   └── lib2
│       ├── CMakeLists.txt
│       ├── lib2.c
│       └── lib2.h
└── cmaketutorial
    ├── CMakeLists.txt
    └── cmaketutorial.c

lib1: библиотека общего назначения. Он содержит только .h и его CMakeFiles.txt позволяет вам установить его в /usr/local/include.

lib2: универсальной библиотеке. Он содержит. c и .h, а его CMakeFiles.txt позволяет установить его в /usr/local/include.

lib1 and lib2: это две библиотеки, которые существуют сами по себе и взяты из соответствующих проектов. .

cmaketutorial: это рассматриваемый проект, он содержит .c, который включает lib1 и lib2.

CMakeLists.txt (root)

cmake_minimum_required(VERSION 3.12)
project(
    cmaketutorial
    VERSION 0.0.1
    LANGUAGES C
)

add_definitions(-D_GNU_SOURCE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror -pedantic -Wno-unused-parameter")

add_subdirectory(lib)
add_subdirectory(cmaketutorial)

CMakeLists.txt (root/lib)

add_subdirectory(lib1)
add_subdirectory(lib2)

CMakeLists.txt (root/lib/lib1)

cmake_minimum_required(VERSION 3.12)
project(
    lib1
    VERSION 0.0.1
    LANGUAGES C
)

add_library(${PROJECT_NAME} INTERFACE)

target_include_directories(
    lib1
    INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
)

# install rules
install(FILES lib1.h DESTINATION include)

CMakeLists.txt (root/lib/lib2)

cmake_minimum_required(VERSION 3.12)
project(
    lib2
    VERSION 0.0.1
    LANGUAGES C
)

if(CMAKE_CURRENT_BINARY_DIR)
    set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR})
endif(CMAKE_CURRENT_BINARY_DIR)

add_library(
    ${PROJECT_NAME}
    lib2.c
    ${CMAKE_CURRENT_BINARY_DIR}/lib2.h
)

target_include_directories(
    ${PROJECT_NAME}
    INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}
    PRIVATE ${CMAKE_CURRENT_BINARY_DIR}
)

install(TARGETS ${PROJECT_NAME} DESTINATION lib)
install(FILES lib2.h DESTINATION include)

CMakeLists.txt (root/cmaketutorial)

# add the executable
add_executable(cmaketutorial cmaketutorial.c)

target_include_directories(
    cmaketutorial PUBLIC
    "${PROJECT_BINARY_DIR}"
)

С током CMakeFiles * при компиляции cmaketutorial.c он не может связать lib1 и lib2. Как мне изменить общий CMakeFiles.txt, чтобы все прошло как надо? Могу ли я использовать оригинальные CMakeFiles.txt из lib1 и lib2?

Кроме того, могу ли я настроить проект, для которого в cmaketutorial.c включаются формы #include <lib/lib1.h> и #include <lib/lib2.h>?

1 Ответ

2 голосов
/ 15 марта 2020

Как я могу изменить общий файл CMakeFiles.txt, чтобы все прошло как надо?

Вы должны связать cmaketutorial исполняемый файл с библиотеками lib1 и lib2. Добавьте target_link_libraries (cmaketutorial PUBLIC lib1 lib2) к cmaketutorial/CMakeLists.txt.

. Могу ли я настроить проект, для которого включены в cmaketutorial. c имеют форму #include и #include?

Переместите эти файлы в соответствующие каталоги. Так что:

mkdir lib/lib1/lib lib/lib2/lib
mv lib/lib1/lib1.h lib/lib1/lib
mv lib/lib2/lib2.h lib/lib2/lib/lib2.h

, а затем обновите lib/lib2/CMakeLists.txt с помощью add_library(... lib/lib2.h) и обновите все install правила при необходимости.

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