C的分文件编写与动态库

分文件编写

C的文件分为了函数声明的.h文件、函数实现的.c文件和功能实现的mian.c文件

以下使用一个输出两数之间最大值函数来说明分文件编写。

test.c

cpp 复制代码
#include<stdio.h>
#include<stdlib.h>
#include"MyMax.h"

int main(){
    int a = 13;
    int b = 20;
    printf("a = %d, b = %d, max = %d/n",&a,&b,Maxium(a,b));
    return 0;

}
或者是键盘输入:
int main() {
    int a, b;
    printf("please put num1:\n");
    scanf("%d",&a);
    printf("please put num2:\n");
    scanf("%d",&b);
    printf("%d\n",Maxium(a,b));
    return 0;   
}

MyMax.h

cpp 复制代码
#pragma once

#ifndef MYMAX_H
#define MYMAX_H

#include<stdio.h>
#include<stdlib.h>

int Maxium(int a, int b);

#endif

MyMax.c

cpp 复制代码
int Maxium(int a, int b) {
    return a >= b ? a : b;
}

动态库

利用上面的函数实现一个math的动态库

1、生成位置无关的.o文件:gcc -c MyMax.c -o MyMax.o -fPIC

使用这个参数过后,生成的函数就和位置无关,挂上@plt标识,等待动态绑定

2、使用gcc -shared制作动态库: gcc -shared -o libMyMath.so MyMax.o

3、使得动态库有效

【1】 通过环境变量: export LD_LIBRARY_PATH=动态库路径

./a.out 成功!!! (临时生效, 终端重启环境变量失效)

失效的原因是 一个程序会生成一个地址空间,环境变量也在这个空间中,一旦终端关闭,程序失效,地址空间也没了

【2】 永久生效: 写入 终端配置文件。 .bashrc 建议使用绝对路径。

  1. vi ~/.bashrc

  2. 写入 export LD_LIBRARY_PATH=动态库路径 保存

3). .bashrc/ source .bashrc / 重启终端 ---> 让修改后的.bashrc生效

4)./a.out 成功!!!

【3】 拷贝自定义动态库 到 /lib(标准C库所在目录位置)

【4】 配置文件法

sudo vi /etc/ld.so.conf

  1. 写入 动态库绝对路径 保存

sudo ldconfig -v 使配置文件生效。

4)./a.out 成功!!!--- 使用ldd a.out 查看

4、编译可执行程序时指定所使用的动态库。-l:指定库名 -L:指定库路径

gcc test.c -o test -l MyMath -L ./lib -I ./INC

5、运行可执行程序./a.out

写成简单的makefile文件

复制代码
src = $(wildcard ./*.c) #src=helloc.c,add.c,sub.c,mul.c
obj = $(patsubst %.c,%.o,$(src)) #"%"表示匹配一个或者多个文件,参数之间是逗号分隔
ALL:test
test:test.c
    gcc test.c -o test -l MyMath -L ./lib -I ./INC
libMyMath.so:MyMax.o
    gcc -shared -o libMyMath.so MyMax.o
MyMax.o:MyMax.c
    gcc -c MyMax.c -o MyMax.o -fPIC
clean:
    -rm -rf $(obj) test

但是即使在makefile文件中增加了该行规则,它是不会帮你自动删除的,需要你收到敲命令删除,但为了删除文件错误,一般都会先敲测试命令表示模拟删除并不会真正删除,程序员比较结果正确后就正式删除,步骤如下:

//以下是在终端敲命令

//1 先模拟删除

make clean -n

//2 正确后正式删除

make clean

相关推荐
wuyk5551 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
xx~t2 小时前
嵌入式——51单片机1
linux·c语言·单片机·嵌入式硬件·51单片机
Navigator_Z4 小时前
LeetCode //C - 1240. Tiling a Rectangle with the Fewest Squares
c语言·算法·leetcode
码行山野赴时序归途4 小时前
C语言预处理指令:编译前的“幕后导演“
c语言·开发语言
2401_858286117 小时前
130.【C语言】可变参数宏
c语言·开发语言
彧azz7 小时前
B树原理与C语言实现
c语言·数据结构·b树
零依赖极客7 小时前
《30 天手搓 ARM 架构零依赖纯 C 推理引擎》课程介绍与大纲
c语言·开发语言·arm开发·人工智能·嵌入式硬件·ai编程
LuminousCPP8 小时前
数据结构-排序(三):快速排序进阶|挖坑法、双指针交换与手动栈非递归实现
c语言·数据结构·笔记·算法·排序算法
linx2958 小时前
单元三 · 那 C 的底层知识怎么办
c语言·开发语言·数据结构·c++·嵌入式硬件
linx2959 小时前
单元四 · 对称认知·上:内存与指针
c语言·开发语言·数据结构·嵌入式硬件·算法