Гарантирует ли это, что 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