需求:主体函数已经写好,需要一个mymath的包让我的程序执行起来
创建myadd.c mysub.c myadd.h mysub.h在mylib目录下
myadd.h
#pragma once
int myadd(int a,int b);
myadd.c
#include"myadd.h"
int myadd(int a,int b){
return a+b;
}
mysub.h
#pragma once
int myadd(int a,int b);
mysub.c
#include"mysub.h"
int mysub(int a,int b){
return a-b;
}
main.c创建在otherPerson目录下
#include<stdio.h>
#include"mysub.h"
#include"myadd.h"
int main(){
int a=100;
int b=30;
printf("%d+%d=%d\n",a,b,myadd(a,b));
printf("%d+%d=%d\n",a,b,mysub(a,b));
return 0;
}
如何创建静态链接呢?(.a文件)
1、首先要将myadd.c mysub.c形成二进制的链接文件
gcc -o myadd.c
gcc -o mysub.c
2、在mylib文件下进行静态包打包
ar -rc libmymath.a *.o
//-r指的是文件中如果是更新的文件,进行替换,如果不是进行创建
//-c指的是创建
//libmymath.a其实形成的包是mymath,Linux有规定,去掉头尾
3、将.h文件和形成的.a包给别人
4、让编译器找到头文件和库文件
gcc -o mytest main.c -I./include -L./lib -lmymath
//-I是告诉编译器头文件的位置 include
//-L是link的意思,告诉编译器库文件的位置
//-l也是link的意思,但是是告诉编译去连哪个库,要显示的告诉gcc用哪个库
如何创建动态链接呢?(.so文件)
1、编译myadd.c mysub.c,会形成对应的.o文件
gcc -fPIC -c myadd.c
gcc -fPIC -c mysub.c
// -fPIC形成与位置无关码
//-c形成二进制文件
2、用gcc继续打包
gcc -shared -o libmymath.so *.o
//-shared共享
3、编译文件
gcc -omytest main.c -I./include -Llib -lmymath
4、让os找到动态库
//ldd lddmytest查看math依靠的路径
a 添加环境变量(这个是临时方案,一旦重新打开xshell就没了)
lddmytest
echo $LD_LIBRARY_PATH//查看这个环境
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/gtt/alldir/20230815/otherperson/lib//查看环境
b 添加软连接
sudo ln -s /home/gtt/alldir/20230815/mylib/lib/libmymath.so /lib64/libmymath.so
//在系统lib64下建立软连接指向我当前的路径
c 配置文件方案
ls /etc/ld.so.conf.d///查看动态库的配置文件 ld动态库。so动态库的后缀,conf配置文件
sudo touch /etc/ld.so.conf.d/gtt.conf//创建自己的配置文件
在gtt.conf中添加动态库的地址 ,不用写到库中 /home/gtt/alldir/20230815/mylib/lib
sudo ldconfig//让系统配置文件生效