CMake学习(二) —— 链接库的生成

2023-05-16

除使用 add_executable 生成可执行文件外,还可以使用 add_library 生成链接库。

一、Linux的链接库


首先讲一下 linux 的链接库,就是一些函数代码的二进制形式,有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。

静态链接库 .a:
文件的命名方式:“libxxx.a”,库名前加“lib”,后缀是“.a”,库名是“xxx”。
静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。
当要使用时,链接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。

动态链接库(共享库):
文件命名方式:“libxxx.so”,库名前加“lib”,后缀是“.so”,库名是“xxx”。
动态库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
某个程序在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须使用相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址无关代码(Position Independent Code (PIC))。

动态链接库的加载方式有两种:隐式加载和显示加载。

注意:linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。

二、创建链接库

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


name 创建的链接库的名称,在项目中必须是全局唯一的。
STATIC、SHARED或MODULE可以指定要创建的库的类型。 STATIC代表静态链接库。 SHARED代表动态链接库。 MODULE库是未链接到其他目标的插件,但可以使用类似dlopen的功能在运行时动态加载。
EXCLUDE_FROM_ALL如果给出,将在创建的目标上设置相应的属性。请参阅EXCLUDE_FROM_ALL
source 创建链接库所依赖的源文件。
三、一个例子:
hello.c

#include <stdio.h>

int hello()
{
    printf("hello CMake!\n");

    return 0;
}


CMakeLists.txt

# CMake最低版本要求
cmake_minimum_required(VERSION 3.5)

# 项目名称
project(test_3)

# 指定生成目标 
add_executable(test_3 main.c)

# 生成可执行文件
# 这里直接写库名称 test_2 就可以,CMake 会自动添加前缀 lib 和后缀 .a
add_library(test_2 STATIC hello.c)


编译后的结果:

在这里插入图片描述

 

libtest_2.a即生成的静态链接库。
————————————————
 

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

CMake学习(二) —— 链接库的生成 的相关文章

随机推荐

  • 【20-9-22】Python实现多进程多线程

    简介 对于计算机来说 xff0c 有两种实现多任务的方式 xff1a 并行和并发 并发 xff1a 一段时间内交替执行某些任务 如单核CPU轮流执行一些程序 并行 xff1a 一段时间内同时运行多个任务 多核cpu处理多任务 1 进程 程序
  • 【21-3-28】pvcreate device excluded by a filter

    使用Lvm创建虚拟磁盘时报错的解决方法 xff1a span class token function sudo span pvcreate dev sdd Device dev sdd excluded by a filter 原因是因为
  • BMI指数

    身体质量指数 xff08 Body Mass Index xff0c BMI xff09 是根据人的体重和身高计算得出的一个数字 xff0c BMI对大多数人来说 xff0c 是相当可靠的身体肥胖指标 xff0c 其计算公式为 xff1a
  • 生日悖论的Python实现

    题目 xff1a 如果你的班级中有23个学生 xff0c 那么其中有两个人生日相同的概率为多大 xff1f usr bin env python coding 61 utf 8 import random def has duplicate
  • 二分法查找的Python实现

    代码如下 xff1a usr bin env python coding 61 utf 8 def BinarySearch t x t sort 对列表进行排序 xff0c 列表是有序的 xff0c 是二分法的前提 low 61 0 hi
  • Python中bisect模块用法,及实现方式

    bisect用法 import bisect bisect bisect left t x 在T列表中查找x xff0c 若存在 xff0c 返回x左侧位置 bisect bisect right t x bisect insort lef
  • c++实验六总结(自用)

    实验目的 掌握派生类的声明方法和派生类构造函数的定义方法 掌握不同方式下 xff0c 构造函数与析构函数的执行顺序与构造规则 程序如下 xff1a include lt iostream gt include lt string gt us
  • 光网络知识

    一 WDM网络体系结构注意点 1 波长复用 2 波长转换 3 透明性 4 电路交换 5 生存性 xff1a 当网络出现故障时 xff0c 光路能够自动路由到另一条备份路径上 xff0c 为网络提供了高度的弹性 6 光路拓扑 二 波分复用网络
  • docker镜像更新后 如何正确更新对应的容器 避免数据丢失

    容器的更新大致分为以下两种方法 1 容器并未存储任何应用程序的数据 在这种情况下 您可以在任何时候使用它的更新版本替换APP容器 方法是执行如下所示 span class token function docker span pull my
  • netconn_accept返回值为0,OSQCreate出错 lwip uocsii

    我是在main中有创建信号量的函数 led event 61 OSQCreate amp led q 0 MSGSIZE 这个因为配置中信号量上限较小 而在sys arch c中有一个创建消息邮箱的函数 err t sys mbox new
  • 零基础自学STM32-复习篇2——使用结构体封装GPIO寄存器

    我们首先要了解寄存器的一个特点 xff0c 他不是只针对一个外设 xff0c 而是所有的外设都 就拿GPIO的CRL xff0c ODR寄存器来说 对于GPIOA GPI xff2f E都有一组功能相同的寄存器只是地址不一样而已 xff21
  • 写给小白:使用GitHub来托管论文吧

    使用GitHub来托管论文吧 摘要 xff1a 写给小白 对于非计算机专业的小伙伴 xff0c 可能很少接触到GitHub吧 xff0c 但GitHub真心好用 xff0c 虽然我们不会用它来进行 托管代码 xff0c 但是可以用来托管论文
  • 【软件安装】ElasticSearch在Linux系统中的安装

    0 安装JDK xff0c 并配置环境变量 ElasticSearch依赖Java环境 xff0c 先在服务器上安装好JDK xff0c 并配置好JAVA HOME环境变量 1 从官网下载ElasticSearch压缩包到本地 cd usr
  • Python爬取淘宝商品数据,价值千元的爬虫外包项目

    前言 本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 如有问题请及时联系我们以作处理 PS xff1a 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 完整代码可以点击下方链接获取 python免费学习资
  • argparse简介

    一 argparse简介 argparse 模块是 Python 内置的用于命令项选项与参数解析的模块 xff0c argparse 模块可以让人轻松编写用户友好的命令行接口 xff0c 能够帮助程序员为模型定义参数 argparse定义四
  • Ubuntu22.04安装、配置、美化、软件安装、配置开发环境

    Ubuntu22 04安装 配置 美化 软件安装 配置开发环境 一 Ubuntu Windows11 xff08 10 xff09 双系统安装 因为ubuntu的安装网上的教程特别多了 xff0c 所以这里不做赘述 xff0c 推荐使用小破
  • 直观理解uCOSII中的信号量的作用、优先级翻转现象、互斥信号量对优先级翻转现象的作用

    信号量的作用 优先级翻转现象 uCOS中的特殊信号量 互斥信号量 本文作为一个学习uCOS的经验分享 xff0c 希望能给初学小白们一个参考 以例程和运行效果来说明 xff0c 对一些概念性的东西这里不做过多解释 xff0c 网上相关文章多
  • C语言实现ftp客户端

    在VS2010新建win32控制台空项目 xff0c 加入下面代码 xff1a ftplib h xff1a ftplib h header file for callable ftp access routines Copyright C
  • 查看opencv文件所在目录方式

    查看opencv文件所在目录方式
  • CMake学习(二) —— 链接库的生成

    除使用 add executable 生成可执行文件外 xff0c 还可以使用 add library 生成链接库 一 Linux的链接库 首先讲一下 linux 的链接库 xff0c 就是一些函数代码的二进制形式 xff0c 有动态与静态