首页 > 系统相关 >嵌入式Linux编程基础 | GCC 静、动态函数库的创建与链接方法

嵌入式Linux编程基础 | GCC 静、动态函数库的创建与链接方法

时间:2024-10-18 11:44:10浏览次数:6  
标签:GCC 函数库 lib 静态 Linux main 目录 inc

一、静态库与动态库的区别

库有动态与静态两种,动态通常用 .so 为后缀,静态用 .a 为后缀。例如:libhello.so 表示一个命名为 libhello 的动态库,libhello.a 则是一个命名为 libhello 的静态库。
当使用静态库时,连接器找出程序所需的函数,并将其拷贝到可执行文件,一旦链接成功,静态程序库就不再需要了;而动态库则会在执行程序内留下一个标记指明,当程序执行时,首先必须载入这个库。由于动态库节省空间,linux 下进行连接的缺省操作是首先连接动态库。

二、静态函数库的创建与链接

1. 编译生成 .o 文件

编译当前路径下的所有后缀名为 .c 的源程序文件,生成同名的 .o 目标文件

gcc -c *.c

2. 创建静态库

使用 ar 命令,生成库名为 mytest 的静态函数库 libmytest.a,存放 a.o 和 b.o 两个模块

ar -srv libmytest.a a.o b.o

3. 链接静态库生成可执行文件

链接当前路径下的 libmytest.a 函数库,生成 main.exe 可执行文件

gcc main.o -o main.exe libmytest.a

4. 运行

./main.exe

三、动态函数库

为了方便管理,通常在工程目录下创建 src、inc、lib 等目录,src 目录存放后缀名为 .c 的源程序文件,inc 存放后缀名为 .h 的头文件,lib 存放库文件。以下命令以该目录结构为例嘻嘻~

1. 编译生成.o文件

./src/*.c 表示 src 目录中的所有 .c 文件,-I ./inc 表示将 inc 目录加入到程序头文件目录列表中(inc 目录用于存放 .h 文件)

gcc -c -fPIC ./src/*.c -I ./inc

2. 创建动态库

./lib/libmytest2024.so 表示在 lib 目录下生成 libmytest2024.so 动态库,需要先创建 lib 目录,否则报错没有那个文件或目录。

gcc -shared -fPIC -o ./lib/libmytest2024.so a.o b.o

3. 链接静态库生成可执行文件

-L ./lib/ -lmytest2024 表示将当前目录下的 lib 目录加入到程序函数档案库文件目录列表中,链接名字为 mytest2024 的库文件。默认库文件路径:/usr/lib/

gcc ./src/main.c -o app2024 -L ./lib/ -lmytest2024 -I ./inc

4. 复制静态库到本机的 /lib 目录下

sudo cp ./lib/libmytest2024.so /lib

5. 运行

./app2024

测试代码

1)main.c

#include "a.h"
#include "b.h"
int main() {
  a();
  b();
  return 0;
}

2)a.c

#include <stdio.h>
void a() {
  printf("宫廷玉液酒\n");
}

3)b.c

#include <stdio.h>
void b() {
  printf("一百八一杯\n");
}

4)a.h

#ifndef _a_H_
#define _a_H_
void a();
#endif

5)b.h

#ifndef _b_H_
#define _b_H_
void b();
#endif

 
演示结果
image

标签:GCC,函数库,lib,静态,Linux,main,目录,inc
From: https://www.cnblogs.com/whbg/p/18472551

相关文章

  • Linux常用命令
    Linux的使用中常用的一些命令如下:查看文档命令:cat:查看文档内容:cat<file>:全部显示一个文件的所有内容,默认不显示行号cat-n<file>:查看文件,同时会显示行数。head:只查看开头的内容head<file>:默认只显示开头的前10行head-n<num><file>:指定显示开头的前num行......
  • 第36篇 linux服务器上启动framework应用程序流程
    framework开发的应用程序,一般是不会在linux服务器上运行的,但是我们可以通过mono进行应用部署1.查看linux服务上是否已经安装mono-core方式1:rpm命令查看rpm-qa|grepmono-core有结果返回,说明已经安装方式2:使用yumlistinstalledyumlistinstalled|grepmono-core......
  • Linux内核中__iomem的解析
    内核代码中充斥着大量的__iomem修饰的void类型的指针,像下面这样:void__iomem*devm_ioremap_resource(structdevice*dev, conststructresource*res){ resource_size_tsize; void__iomem*dest_ptr; char*pretty_name; BUG_ON(!dev); if(!res||resourc......
  • Linux中文件的读写过程
    文件的读取过程在Linux系统中,读取文件的过程主要由操作系统内核通过文件系统与存储设备的交互来完成。以下是文件读取过程的详细步骤:1.系统调用阶段当用户程序(如cat、less)请求读取文件时,会调用系统调用(如open()或read())来请求访问文件。这些调用会传递文件路径等参数给内......
  • Linux驱动开发 platform设备注册详解
    常用的与平台设备注册相关的函数及其作用:1.platform_device_register()功能:用于注册平台设备到内核设备模型中。注册后,设备与相应的驱动程序绑定,驱动的probe函数被调用以进行初始化。函数原型:intplatform_device_register(structplatform_device*pdev);参数:pde......
  • 【Linux线程】Linux多线程编程:深入理解线程互斥与同步机制
    ......
  • [Redis] 在Linux中安装Redis并连接图形化工具详细过程(附下载链接)
    前言安装Redis之前应该在虚拟机中安装Linux系统,这里使用centos7版本[linux]在VMware中安装linux、文件下载及详细安装过程(附下载链接)-CSDN博客安装Linux后,更换yum源为阿里云并安装gcc依赖[Linux]CentOS7替换yum源为阿里云并安装gcc详细过程(附下载链接)-CSDN博客redis-6......
  • linux ps和kill指令
    目录ps命令kill指令:示例:补充:管道的概念管道的概念管道的用途示例在Linux系统中,ps和kill是两个非常常用的命令,用于管理和终止进程。ps命令ps命令用于显示当前系统中的进程状态。它可以提供关于系统进程的详细信息,如进程ID、运行用户、CPU使用率、内存使用......
  • 公网Linux环境搭建frp实现内网穿透
    前提:本实验为一台ubuntu22操作系统云主机脚本适用于安装平台:CentOS、Debian、UbuntuFRP项目地址:https://github.com/fatedier/frpFRP一键脚本地址:https://github.com/MvsCode/frps-onekey 1、FRP服务器端一键安装脚本(脚本在本文最后有,如果在服务器上无法获取到下面的instal......
  • Linux环境下Matplotlib绘图中文乱码问题
    问题:如图所示,中文乱码1.准备ttf字体文件:路径: C:\Windows\Fonts例如楷体:simkai.ttf2.查看当前环境的matplot字体路径:importmatplotlibprint(matplotlib.matplotlib_fname())运行结果:/home/3kyou/.local/lib/python3.7/site-packages/matplotlib/mpl-data/matplotlibr......