CMake: библиотека не создана - PullRequest
0 голосов
/ 23 марта 2019

У меня есть проектный каталог A, в котором есть подкаталоги B и C. Я хочу C в качестве библиотеки общих объектов и позволить B использовать ее.CMakeLists.txt выглядит следующим образом -

A

...
add_subdirectory(C)
add_subdirectory(B)
...

[1). Это гарантирует, что C сначала cmake (ed), а затем B?]

B

...
pkg_check_modules(C_LIB REQUIRED C)
target_link_libraries(B C_LIB)
...

C

...
add_library (C SHARED ./*c)
...

Я получаю ошибку в сборке, которая говорит, что пакет c не найден.

Однако, если яИмея каталог C в той же иерархии, что и A, я могу правильно связать B и C.

Я хочу поместить свой код в A и получить правильные зависимости.Чего мне не хватает в моем CMakeLists.txt?

1 Ответ

0 голосов
/ 23 марта 2019

Гарантирует ли это, что C сначала cmake (ed), а затем B?

Нет.Он не гарантирует, что даже существует проект C или B, и не гарантирует, что они будут построены вообще.Это просто источники / включает (особым образом) C/CMakeLists.txt и B/CMakeLists.txt файлы, вот и все.

add_library (C SHARED ./*c)

Это неверно, если у вас нет исходного файла с именем *c.Вы хотите:

file(GLOB sources ./*c)
add_library(C SHARED ${sources})

Библиотека add_library не понимает глобуляции.

pkg_check_modules (C_LIB REQUIRED C)
target_link_libraries (B C_LIB)

Это странно.У вас нет pkg-config модулей с именем "C", не так ли?Вы, вероятно, хотите:

 target_link_libraries(B C)

или лучше попытаться всегда явно указывать PUBLIC или PRIVATE или INTERFACE:

target_link_libraries(B PUBLIC C)

Это обеспечит включение интерфейса Bпути, которые были (или будут?) добавлены к C, и что, когда исполняемый файл является сборкой, использующей B, C связан с / против него.Это не означает «сборка C до B», это означает: используйте интерфейс C для сборки B.

Возможно, попробуйте это так:

A

cmake_minimum_required(VERSION 3.14)
project(A)
add_subdirectory(C)
add_subdirectory(B)

B

cmake_minimum_required(VERSION 3.14)
project(B)
add_executable(B ./source1.c)
target_link_libraries(B PUBLIC C)

C

cmake_minimum_required(VERSION 3.14)
project(C)
add_library(C SHARED sourcec.c)
target_include_directories(C PUBLIC ./) # so when compiling B it uses this include dir
...