香橙派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博客

相关推荐
重庆小透明1 小时前
【从零开始学习JVM | 第六篇】运行时数据区
java·jvm·后端·学习
晨曦backend3 小时前
Vim 替换命令完整学习笔记
笔记·学习·vim
liuyang___4 小时前
日期的数据格式转换
前端·后端·学习·node.js·node
蒙奇D索大4 小时前
【11408学习记录】[特殊字符] 速解命题核心!考研数学线性代数:4类行列式满分技巧(含秒杀公式)
笔记·学习·线性代数·考研·改行学it
江池俊5 小时前
通过Docker和内网穿透技术在Linux上搭建远程Logseq笔记系统
linux·笔记·docker
哆啦A梦的口袋呀5 小时前
基于Python学习《Head First设计模式》第十章 状态模式
学习·设计模式
moxiaoran57535 小时前
uni-app学习笔记三十六--分段式选项卡组件的使用
笔记·学习·uni-app
笑鸿的学习笔记5 小时前
Windows笔记之Win11让非焦点窗口程序也能获得流畅性能的方法
windows·笔记
栗子不爱栗子6 小时前
从理解AI到驾驭文字:一位技术爱好者的写作工具探索手记
python·学习·ai
moxiaoran57537 小时前
uni-app项目实战笔记1--创建项目和实现首页轮播图功能
笔记·uni-app