香橙派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++示例:
创建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文件:
创建步骤如下:
nano hello.c
然后输入以下代码:
#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 :
./a.out
结果打印了 Hello, World!\n
也可以这样编译生成:gcc hello.c -o myfile.exe
运行:
./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:
//test.h:#include <stdio.h>void test1(void); void test2(void); void test3(void);
test1.c:
//test1.c #include <stdio.h> #include "test.h"void test1(void) {printf("test1_print \r\n"); }
test2.c:
//test2.c #include <stdio.h> #include "test.h"void test2(void) {printf("test2_print \r\n"); }
test3.c:
//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。
//testso.c #include "test.h"//test.c:int main() {test1();test2();test3();return 0; }
编译将testso.c与动态库libtest.so链接生成执行文件 testso
gcc testso.c -L. -ltest -o testso
将动态链接库.libtest.so复制到标准问题:
使用
sudo
权限将.so
文件复制到/usr/local/lib
:sudo cp libtest.so /usr/local/lib
更新动态链接器缓存:
运行ldconfig
命令以更新动态链接器的缓存,这样系统就能识别新添加的库sudo ldconfig
运行test.so:
./testso
查看是否连接到库:
ldd testso
参考文章:
C/C++中关于静态链接库(.a)、动态链接库(.so)的编译与使用_c++ .a-CSDN博客