美文网首页Cmake学习
Cmake 库依赖关系的传递

Cmake 库依赖关系的传递

作者: Tooosky | 来源:发表于2020-01-16 10:13 被阅读0次

问题描述

假设动态库B依赖动态库A,可执行程序C依赖动态库B。 如下图:

C[程序C] -->|依赖| B(动态库B) --> |依赖|A(动态库A)

在linux平台下,按照正常来说,在编译C时,只需要链接B就好了。
但是使用Cmake编译时,会报找不到libA.so的错误。
通过cmake生成的gcc命令看到,编译命令确实将A也链接了进来。

那么问题来了,为什么cmake会将B的依赖加到我C的头上?

答案

原因在于 target_link_libraries() 命令。
熟悉cmake的朋友都知道这是设置链接库的命令。

但其实它的原型是:

target_link_libraries(<target>
                    <PRIVATE|PUBLIC|INTERFACE> <lib> ...
                    [<PRIVATE|PUBLIC|INTERFACE> <lib> ... ] ...])

可以通过PRIVATE | PUBLIC | INTERFACE 设置依赖的传递性.

摘抄一下官方文档的描述:

The PUBLIC, PRIVATE and INTERFACE keywords can be used to specify both the link dependencies and the link interface in one command. Libraries and targets following PUBLIC are linked to, and are made part of the link interface. Libraries and targets following PRIVATE are linked to, but are not made part of the link interface. Libraries following INTERFACE are appended to the link interface and are not used for linking <target>.

参考:https://cmake.org/cmake/help/v3.0/command/target_link_libraries.html

其实大白话就是

  • 如果B的头文件中包含了A的头文件(源文件间接包含),那么这里应该用PUBLIC,依赖关系会传递下去。
  • 如果B仅源文件中包含了A的头文件,那么这里应该用PRIVATE,依赖关系不会传递。
  • 如果B的头文件包含A,但源文件未包含,那么这里应该用INTERFACE,依赖关系不会传递。

好了,大家以后再使用target_link_libraries() 的时候就可以加上PRIVATE关键字,这样C就不会链接A了。

需要注意
根据CMP0023描述:
加关键字和不加关键字的用法不可以混合使用,如下面一起使用就会报错。

target_link_libraries(mylib A)
target_link_libraries(mylib PRIVATE B)

参考:https://cmake.org/cmake/help/v3.0/policy/CMP0023.html

相关文章

  • Cmake 库依赖关系的传递

    问题描述 假设动态库B依赖动态库A,可执行程序C依赖动态库B。 如下图: 在linux平台下,按照正常来说,在编译...

  • Maven - 依赖机制

    传递性依赖 传递性依赖是Maven2.0的新特性。假设你的项目依赖于一个库,而这个库又依赖于其他库。你不必自己去找...

  • Cygwin下编译DynaHack

    一.以下依赖库是必须安装的 二.DynaHack用的是CMake构建系统 三.还不算完,还需用CMake的图形界面...

  • AS使用NDK Cmake方式依赖第三方库

    AS使用NDK Cmake方式依赖第三方库注意事项 AS2.2以后支持Cmake了,以前的Android.mk的方...

  • 如何为cmake提供package以便于find_package

    1. CMake带来的改变 1.1 依赖关系的思维转变:用仓库的概念代替目录层级依赖 层级依赖: 扁平依赖: 图一...

  • ubuntu配置opencv3.4.1

    下载opencv3.4.1,并安装cmake接着安装依赖库。sudo apt-get install build-...

  • mysql安装(5.7)(CentOS7.0)

    1、先安装依赖库(yum安装) yum install -y cmake make gcc gcc- c++ bi...

  • FastDDS 测试

    fastdds安装测试 依赖库安装 准备工作 如果支持apt,则预先:brew install cmake pyt...

  • 2021-03-03

    1、首先是配置好opencv的依赖库 yum install cmake gcc gcc-c++ gtk+-dev...

  • 六大设计原则

    单一职责 里氏替换 依赖倒置 对象的依赖关系可以用三种方式传递 通过构造方法传递依赖对象 通过Sette方法传递依...

网友评论

    本文标题:Cmake 库依赖关系的传递

    本文链接:https://www.haomeiwen.com/subject/uccfzctx.html