我有一个项目目录A,其中有子目录B和C。 我希望C作为共享对象库,并让B使用它。 CMakeLists.txt如下所示-
A
...
add_subdirectory(C)
add_subdirectory(B)
...
[1)这样是否可以确保C先被Cake,然后B被Cake? ]
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中缺少什么?
答案 0 :(得分:0)
这是否确保C先被cmake,然后B?
不。它无法确保甚至没有C
或B
项目,也无法确保它们将完全构建。它只是以一种特殊的方式来获取/包含C/CMakeLists.txt
和B/CMakeLists.txt
文件,仅此而已。
add_library(C共享./* c)
这是无效的,除非您有一个名为*c
的源文件。您想要:
file(GLOB sources ./*c)
add_library(C SHARED ${sources})
add_library无法理解小球。
pkg_check_modules(C_LIB必填C)
target_link_libraries(B C_LIB)
这很奇怪。您没有名为“ C”的pkg-config
模块吗?您可能想要:
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