CMake的add_library与target_link_libraries

2023-05-16

一、add_library介绍

使用该命令可以在Linux下生成(静态/动态)库so或者.a文件,Windows下就是dll与lib文件,它有两种命令格式

1.1 第一种格式 :

 Normal Libraries,add_library命令的格式为

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [<source>...])

生成一个名为 < name > 的library,注意以下规则:

  1. < name > 应该保证在一个项目中的唯一性。
  2. 实际生成的library文件名是基于平台的约定规则,比如linux下的lib< name >.a, Windows下的< name >.lib等
  3. STATIC,SHARED,MODULE用于指定创建的library类型。
  4. STATIC库:生成obj文件后,将其链接成静态库,用于链接到其他targets。
  5. SHARED库:生成obj文件后,将其链接成动态库,用于运行时加载。
  6. MODULE库:不能链接到其他targets,但是可以用dlopen之类的方法在运行时动态加载。
  7. 如果没有明确指定要生成的library的类型到底是STATIC,SHARED还是MODULE。则查看BUILD_SHARED_LIBS变量,如果值为ON,则默认是SHARED,否则默认STATIC。
  8. 对于SHARED和MODULE类型的库,POSITION_INDEPENDENT_CODE属性自动置为ON。
  9. EXCLUDE_FROM_ALL:表明该target是否从默认构建target中排除。
  10. source参数可以使用generator表达式($ <…>)。

 1.2 第二种格式 :

生成一个obj文件对象,该对象库只编译源文件,但不链接。

add_library(<name> OBJECT [<source>...])

由add_library()或 add_executable()创建的目标可以使用$<TARGET_OBJECTS:name>这样的表达式作为源引用对象,其中,name是对象库的名称。格式如下:

add_library(... $<TARGET_OBJECTS:name> ...)
add_executable(... $<TARGET_OBJECTS:name> ...)

 二、target_link_libraries的介绍

指定链接给定目标和/或其依赖项时要使用的库。命名的<tartget>必须是由add_executable()或add_library()之类的命令创建的。一般与 link_directories连用(添加外部库的搜索路径 )

target_link_libraries命令的格式

target_link_libraries(<target> ... <item>... ...)

三、add_library的实例

四个文件hello.h,hello.cpp,main.cpp,CMakelist.txt,目录如下

 hello.h

#include <string>
 
void test(std::string str);

hello.cpp

#include "hello.h"
#include <iostream>
 
void test(std::string str)
{
    std::cout << str << std::endl;
}

main.cpp

#include "hello.h"
#include <iostream>
 
int main(int argc, char** argv)
{
    std::cout << "In main..." << std::endl;
    test("hello, world!");
    return 0;
}

 CMakeList文件

第一种library格式

cmake_minimum_required (VERSION 3.12.1)

project (Demo)

# 生成对象库文件
add_library(hello hello.cpp)

# 添加头文件目录
target_include_directories(hello PUBLIC ${CMAKE_SOURCE_DIR}/public)

# 生成可执行文件
add_executable(Demo main.cpp)

# 链接对象库
target_link_libraries(Demo hello)

第二种library格式

cmake_minimum_required (VERSION 3.12.1)

project (Demo)

# 生成对象库文件
add_library(hello OBJECT hello.cpp)

# 添加头文件目录
target_include_directories(hello PUBLIC ${CMAKE_SOURCE_DIR}/public)

# 添加编译选项 -Wall
target_compile_options(hello PUBLIC -Wall)

# 生成可执行文件
add_executable(Demo main.cpp $<TARGET_OBJECTS:hello>)

# 添加头文件目录
target_include_directories(Demo PUBLIC ${CMAKE_SOURCE_DIR}/public)

编译,运行

 另一种写法

cmake_minimum_required (VERSION 3.12.1)

project (Demo)

# 生成对象库文件,不链接
add_library(hello OBJECT hello.cpp)

# 添加头文件目录
target_include_directories(hello PUBLIC ${CMAKE_SOURCE_DIR}/public)

# 添加编译选项 -Wall
target_compile_options(hello PUBLIC -Wall)

# 生成可执行文件
add_executable(Demo main.cpp)

# 链接对象库
target_link_libraries(Demo hello)

编译,运行

大家习惯通过 $<TARGET_OBJECTS:name>引用object文件。其实object library与静态库,动态库一样,都是可以设置PUBLIC/PRIVATE属性的,再通过target_link_library()命令链接

参考:

add_library — CMake 3.22.0 Documentation

target_link_libraries — CMake 3.22.0 Documentation

cmake指令基础知识_ShawnRacine的博客-CSDN博客
cmake使用示例与整理总结_carl_wang_cn的博客-CSDN博客_cmake使用示例与整理总结

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake的add_library与target_link_libraries 的相关文章

随机推荐

  • cpp-httplib库简单原理,听说你还不会开源库?

    cpp httplib库的原理 听说你还不会开源库 xff1f 介绍httplib h头文件的处理流程httplib h头文件的组成httplib h头文件搭建服务端与客户端的原理Get接口listen 0 0 0 0 8989 接口 介绍
  • UART串口调试

    转载自 xff1a https www secpulse com archives 157847 html UART串口调试 脉搏文库 TideSec 2021 04 23 4 356 0x00前言 前段时间陆陆续续的对光猫 路由器 摄像头
  • visca协议及其实现的简单认识

    转载自 xff1a https latelee blog csdn net article details 35811777 visca协议及其实现的简单认识 李迟 2014 06 30 14 09 01 7064 收藏 12 分类专栏 x
  • C语言实现的一个简单的HTTP程序

    转载自 xff1a https www cnblogs com xuwenmin888 archive 2013 05 04 3059282 html C语言实现的一个简单的HTTP程序 以下是参考 lt winsock网络编程经络 gt
  • ideavim使用

    IdeaVim 常用操作 IdeaVim简介 IdeaVim是IntelliJ IDEA的一款插件 xff0c 他提高了我们写代码的速度 xff0c 对代码的跳转 xff0c 查找也很友好 安装之后它在 Tools gt Vim Emula
  • CAN总线——数据传输故障处理

    最近遇到CAN总线通讯的问题 上位机为arm板 xff0c 核心板为Cortex A9处理器 Linux内核 下位机为5块 STM32板 现象为 xff1a 如果上位机只接收数据 xff0c 一切通讯正常 当上位机下发命令 xff0c 那么
  • 升级构建工具,从Makefile到CMake

    更多博文 xff0c 请看音视频系统学习的浪漫马车之总目录 C C 43 43 编译 浅析C C 43 43 编译本质 一篇文章入门C C 43 43 自动构建利器之Makefile 升级构建工具 xff0c 从Makefile到CMake
  • RTKLIB简介

    RTKLIB是全球导航卫星系统GNSS global navigation satellite system 的标准 amp 精密定位开源程序包 xff0c RTKLIB由日本东京海洋大学 xff08 Tokyo University of
  • zzuli OJ 1038: 绝对值最大

    Description 输入3个整数 xff0c 输出绝对值最大的那个数 Input 输入包含3个int范围内的整数 xff0c 用空格隔开 Output 输出三个数中绝对值最大的数 xff0c 单独占一行 若绝对值最大的数不唯一 xff0
  • md5sum

    ERROR 1550456422 414780061 Client Lidar cipv 213 wants topic rs percept result to have datatype md5sum autodrive msgs Pe
  • libcurl实现HTTP

    关于libcurl的相关函数介绍以及参数详见官方说明 https curl haxx se libcurl c example html HTTP Request 一个http请求包含方法 路径 http版本 请求包头 请求方法 GET H
  • 深夜没事,抓个ARP包吧!

    深夜没事 xff0c 抓个ARP包吧 xff01 ipconfig查看网卡信息 选择en33这个网卡 xff0c 发送两次 xff0c 询问192 168 21 1的mac地址 xff0c 注意 xff1a ARP请求只能在同一子网内部进行
  • linux基础篇(一)——GCC和Makefile编译过程

    linux系列目录 xff1a linux基础篇 xff08 一 xff09 GCC和Makefile编译过程 linux基础篇 xff08 二 xff09 静态和动态链接 ARM裸机篇 xff08 一 xff09 i MX6ULL介绍 A
  • jni/ndk问题 :引用so库报错: java.lang.UnsatisfiedLinkError: No implementation found for

    问题 xff1a 引用so库报错 xff1a java span class token punctuation span lang span class token punctuation span UnsatisfiedLinkErro
  • 《python+opencv实践》一、基于颜色的物体追踪(上)

    点击打开链接 本文主要参考国外一大牛博客 xff0c 然后自己修改得来 相关知识点在这里 实现功能 xff1a 追踪红颜色瓶盖 xff0c 并画出瓶盖轮廓和运动轨迹 from collections import deque import
  • C++的sort函数实现字符串排序

    一 背景 sort函数用于C 43 43 中 xff0c 对给定区间所有元素进行排序 头文件是 include lt algorithm gt 实现原理 xff1a sort并不是简单的快速排序 xff0c 它对普通的快速排序进行了优化 x
  • C# 中的Dispose()用法

    一 对Dispose方法的理解是什么呢 xff1f 使用Dispose方法的对象 xff0c 应释放它拥有的所有资源 它还应该通过调用其父类型的Dispose方法释放其基类型拥有的所有资源 net的对象使用一般分为三种情况 1 创建对象 2
  • C++的 remove函数

    一 介绍 remove函数原型如下 xff1a template lt class ForwardIt class T gt ForwardIt remove ForwardIt first ForwardIt last const T a
  • 主板上的南桥与北桥

    一 历史 曾经 xff0c 北桥芯片和南桥芯片都是主板芯片组中最重要的组成部分 传统来说 xff0c 靠上方的叫北桥 xff0c 靠下方的叫南桥 北桥负责与CPU通信 xff0c 并且连接高速设备 xff08 内存 显卡 xff09 xff
  • CMake的add_library与target_link_libraries

    一 add library介绍 使用该命令可以在Linux下生成 xff08 静态 动态 xff09 库so或者 a文件 xff0c Windows下就是dll与lib文件 xff0c 它有两种命令格式 1 1 第一种格式 xff1a No