当前位置: 首页 > 工具软件 > Link > 使用案例 >

CMake常用命令(六)link_libraries 和 target_link_libraries 链接库

陶飞英
2023-12-01


link_libraries

语法

link_libraries([item1 [item2 [...]]]
               [[debug|optimized|general] <item>] ...)

作用

将库链接到稍后添加的所有目标。

参数

举例

假设当前系统的cmake版本为3.10.2

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
 
include_directories("/opt/MATLAB/R2012a/extern/include")
 
#directly link to the libraries.
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")
LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
 
#equals to below
#LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")
 
add_executable(myProject main.cpp)

target_link_libraries

作用

指定链接给定目标和/或其依赖项时要使用的库或标志。将传播链接库目标的使用要求。目标依赖项的使用要求会影响其自身源的编译。

语法

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

参数

PUBLIC 在public后面的库会被Link到你的target中,并且里面的符号也会被导出,提供给第三方使用。

PRIVATE 在private后面的库仅被link到你的target中,并且终结掉,第三方不能感知你调了啥库
INTERFACE 在interface后面引入的库不会被链接到你的target中,只会导出符号。

作用

该命令可以指定目标(exe或者so文件)需要包含的头文件路径,命名为 < target > 的命令必须是由 add _ Executive ()或 add _ library ()之类的命令创建的,并且不能是 ALIAS 目标。

举例

# 以下写法都可以: 
target_link_libraries(myProject comm)       # 连接libhello.so库,默认优先链接动态库
target_link_libraries(myProject libcomm.a)  # 显示指定链接静态库
target_link_libraries(myProject libcomm.so) # 显示指定链接动态库

# 再如:
target_link_libraries(myProject libcomm.so)  #这些库名写法都可以。
target_link_libraries(myProject comm)
target_link_libraries(myProject -lcomm)

两者的区别

include_directories:

link_libraries用在add_executable之前,target_link_libraries用在add_executable之后

target_include_directories:

link_libraries用来链接静态库,target_link_libraries用来链接导入库,即按照header file + .lib + .dll方式隐式调用动态库的.lib库

使用建议

target_include_directories() 的功能完全可以使用 include_directories() 实现。但是我还是建议使用 target_include_directories()。为什么?保持清晰!

include_directories(header-dir) 是一个全局包含,向下传递。什么意思呢?就是说如果某个目录的 CMakeLists.txt 中使用了该指令,其下所有的子目录默认也包含了header-dir 目录。

注意事项

​​​​​​​target_link_libraries 会在目标程序中生成rpath, 这点请注意 。

参考

官方文档link_libraries
官方文档target_link_libraries
cmake学习笔记之add_library、target_link_libraries和link_directories

link_libraries 和 target_link_libraries 区别

cmake target_link_libraries 中的PRIVATE, PUBLIC, INTERFACE 详解

 类似资料: