香橙派3B学习笔记9:Linux基础gcc/g++编译__C/C++中动态链接库(.so)的编译与使用

这里学习补习一下C/C++中静态链接库(.a)、动态链接库(.so)的编译与使用

ssh : orangepi@本地ip

密码 : orangepi

操作系统发行版: 基于 Ubuntu 20.04.6 LTS(Focal Fossa)的定制版本,专门为 Orange Pi 设备优化。PRETTY_NAME="Orange Pi 1.0.6 Focal"
目录

[使用gcc / g++示例:](#使用gcc / g++示例:)

创建c文件:

gcc编译:

gcc/g++会使用到的一些选项:

动态库(.so)的编译生成:

动态库函数:

编译成一个动态库:

动态链接库的使用:

参考文章:


使用gcc / g++示例:

用gcc编译c语言文件,g++编译c++文件

GCC(GNU Compiler Collection)是一个由GNU项目开发的编译器集合,它能够编译多种编程语言,包括C、C++、Objective-C、Fortran、Ada等。GCC被广泛应用于各种操作系统和平台上,并且支持多种处理器架构。

一个程序的翻译过程

预处理: 头文件展开、去注释、条件编译、宏替换

编译阶段:将代码翻译成汇编指令。

汇编阶段:将汇编代码转换成可进行重定位的二进制文件。

链接阶段:形成可执行文件。

创建c文件:

如图,我在目录 /home/orangepi/gcc_test/ 下有个hello.c文件:

创建步骤如下:

cpp 复制代码
nano hello.c

然后输入以下代码:

cpp 复制代码
#include"stdio.h"


int main(void)
{
  printf("Hello World!");
  
  return 0;
}

按 Ctrl+O 保存文件。按 Enter 确认文件名。按 Ctrl+X 退出 nano。

gcc编译:

进入该目录 cd /home/orangepi/gcc_test/

然后 gcc hello.c

输入 ll 查看输出,发现多了个a.out文件

运行a.out :

cpp 复制代码
./a.out

结果打印了 Hello, World!\n
也可以这样编译生成:gcc hello.c -o myfile.exe

运行:

cpp 复制代码
 ./myfile.exe

gcc/g++会使用到的一些选项:

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面

-S 编译到汇编语言不进行汇编和链接

-c 编译到目标代码

-o 文件输出到 文件

-static 此选项对生成的文件采用静态链接

-g 生成调试信息。GNU 调试器可利用该信息。

-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.

-O0

-O1

-O2

-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高-w 不生成任何警告信息。

-Wall 生成所有警告信息。

动态库(.so)的编译生成:

动态库函数:

使用下面几个程序文件 来生成一个动态库:

test.h:

cpp 复制代码
//test.h:

#include <stdio.h>

void test1(void);
void test2(void);
void test3(void);

test1.c:

cpp 复制代码
//test1.c
#include <stdio.h>
#include "test.h"

void test1(void)
{
  printf("test1_print \r\n");
}

test2.c:

cpp 复制代码
//test2.c
#include <stdio.h>
#include "test.h"

void test2(void)
{
  printf("test2_print \r\n");
}

test3.c:

cpp 复制代码
//test3.c
#include <stdio.h>
#include "test.h"

void test3(void)
{
  printf("test3_print \r\n");
}

编译成一个动态库:

将这几个文件编译成一个动态库**:libtest.so**

复制代码
gcc test1.c test2.c test3.c -fPIC -shared -o libtest.so

通过ll命令可以看到已经生成了libtest.so

动态链接库的使用:

通过一个程序来调用这个库里的函数。程序的源文件为:testso.c。

cpp 复制代码
//testso.c
#include "test.h"//test.c:

int main()
{
  test1();
  test2();
  test3();
  return 0;
}

编译将testso.c与动态库libtest.so链接生成执行文件 testso

cpp 复制代码
gcc testso.c -L. -ltest -o testso

将动态链接库.libtest.so复制到标准问题:

使用 sudo 权限将 .so 文件复制到 /usr/local/lib:

cpp 复制代码
sudo cp libtest.so /usr/local/lib

更新动态链接器缓存 :

运行 ldconfig 命令以更新动态链接器的缓存,这样系统就能识别新添加的库

cpp 复制代码
sudo ldconfig

运行test.so:

cpp 复制代码
./testso

查看是否连接到库:

cpp 复制代码
ldd testso

参考文章:

C/C++中关于静态链接库(.a)、动态链接库(.so)的编译与使用_c++ .a-CSDN博客

相关推荐
小lu飞22 分钟前
2026小红书小工具怎么制作:纯前端 ZIP 打包、沙箱限制与笔记挂载流程
前端·笔记·ai·ai编程
无心水4 小时前
24、系统架构师论文写作专题 核心考点与学习笔记
笔记·学习·系统架构·架构师·安全架构·软考架构师·软考系统架构设计师
蒸蒸yyyyzwd4 小时前
邓明 Agent 系统面试-意图识别学习笔记
笔记·学习
Zhao-Jichao7 小时前
AI Prompting for Everyone 课程笔记 - P21 总结 Conclusion
人工智能·笔记
欢欢李7 小时前
【LTE L3 笔记 05】LTE同步信号
笔记·无线通信·物理层·lte·空口协议
La Pulga9 小时前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
蒸蒸yyyyzwd9 小时前
秋招学习笔记 day106
笔记·学习
小李不想当小白10 小时前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
欢欢李11 小时前
【LTE L3 笔记 04】LTE帧结构
笔记·无线通信·物理层·lte·空口协议
Zhao-Jichao13 小时前
AI Prompting for Everyone 课程笔记 - P20 实验与期末项目 Lab and Final Project
前端·人工智能·笔记