文章目录
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")#directlylink to the libraries.LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")#equalsto 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 详解
版权归原作者 胖茄子 所有, 如有侵权,请联系我们删除。