cmake - 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 中缺少什么?
解决方案
这是否确保 C 先是 cmake(ed) 然后是 B?
不,它甚至不能确保有一个C
norB
项目,也不能确保它们会构建。它只是来源/包含(以特殊方式)C/CMakeLists.txt
和B/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)
或者更好地尝试总是明确地告诉PUBLIC
or PRIVATE
or 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
推荐阅读
- node.js - 无法读取未定义 discord.js 的属性“获取”
- html - 为什么我的列表超出表格单元格?
- kivy - 如何在 KivyMD 文本字段中更改提示文本的字体名称?
- javascript - 当我声明一个类字段时,为什么 jshint 会抛出错误?
- c - 用 C 复位 PIC24FJ128GA010
- javascript - 如何为 fullcalendar 3.9 / bootstrap 4 的事件添加工具提示
- swift - 保存文件后 XCode 12 冻结
- html - 如何在 HTML 中将其转换为 SCSS 内联样式
- sql - 为什么我们对唯一列使用密集索引?
- jakarta-ee - Eclipse Microprofile 和 Jakarta EE 9