首页 > 解决方案 > CMake:未创建库

问题描述

我有一个项目目录 A,其中包含子目录 B 和 C。我希望 C 作为共享对象库并让 B 使用它。CMakeLists.txt 如下所示 -

一个

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

[ 1) 这是否确保 C 先是 cmake(ed) 然后是 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 中缺少什么?

标签: cmakedependenciessubdirectory

解决方案


这是否确保 C 先是 cmake(ed) 然后是 B?

不,它甚至不能确保有一个CnorB项目,也不能确保它们会构建。它只是来源/包含(以特殊方式)C/CMakeLists.txtB/CMakeLists.txt文件,仅此而已。

add_library (C 共享 ./*c)

这是无效的,除非您有一个名为*c. 你要:

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

add_library 不理解 globulations。

pkg_check_modules(C_LIB REQUIRED C) target_link_libraries
(B C_LIB)

这很奇怪。您没有pkg-config名为“C”的模块吗?你可能想要:

 target_link_libraries(B C)

或者更好地尝试总是明确地告诉PUBLICor PRIVATEor INTERFACE

target_link_libraries(B PUBLIC C)

这将确保 B 的接口包含已(或将要?)添加到 的路径C,并且当构建使用 的可执行文件时B,该接口C与它链接/反对它。这并不意味着“构建C之前B”,它意味着:使用接口C来构建B

也许试试这样:

一个

cmake_minimum_required(VERSION 3.14)
project(A)
add_subdirectory(C)
add_subdirectory(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

推荐阅读