Linux C语言交叉开发,动态库编译

Linux C语言交叉开发,动态库编译:

纪念我第一个博客,本人是个小菜鸟,希望大家多多支持,有错误的地方,还望大佬指正!!
1、编写源代码:
.c和.h文件。此处以find_max.c find_max.h sort_arry.c sort_arry.h为例

2、分别将两个不同功能文件分别编译为动态库文件
(1)cc -shared -fpic -o libfindmax.so find_max.c
(2)cc -shared -fpic -o libsortarry.so sort_arry.c
-shared:说明编译为共享库(动态库)
-fpic:于位置无关的
-o:编译为指定文件
libfindmax.so/ libsortarry.so:目标文件
find_max.c/ sort_arry.c:源文件

3、在main函数中调用两个库文件
(1)cc main.c //编译主函数文件
在这里插入图片描述

这是找不到头文件,“ ” 引起来的头文件只会在当前目录查找
解决方法:
指定头文件的路径

	-I   Include
	-I接一个目录名,指定头文件查找路径,可以是相当路径也可以是决定路径,可以接多个-I
	-I后面不需要空格
	你的工程包含头文件时,一般需要指定这些头文件的路径,不然编译器找不到
		编译器还会去系统头文件路径查找

(2)、采用 cc main.c -Iinc
我将函数头文件find_max.h sort_arry.h放在inc目录下
但是又出现了如下状况:
**在这里插入图片描述**

原因是找到了这个函数的声明,但是找不到这个函数的实现
解决方法:
加库文件

-l(lib)
	你的工程源文件中使用了其他模块提供的函数的时候你必须告诉编译器你
	的函数的定义在哪里
	printf/scanf这两个函数,我没有指定函数在哪里实现的,也可以使用呢?
	因为这是C语言的标准库,编译器会自动的包含这个标准库
总之,一句话,你使用不是你自己定义的函数/库函数,就必须指定出处
一般是指定包含该函数的库文件

-l库的名字(去掉前面的lib和后面的.so)
-llibfindmax.so ----->-lfindmax
如:程序中使用数学函数的时候 -lm libm.so
一定要把定义时的lib和.so去掉不然就会出现下面这种状况
在这里插入图片描述

(3)正确版本:cc main.c -Iinc -lfindmax -lsortarry
运行上述程序之后又会出现下面的问题:
/usr/bin/ld: 找不到 -lfindmax -lsortarry
collect2: error: ld returned 1 exit status

编译器找不到名字叫做findmax sortarry的库文件,因为编译器默认只会去标准库(/lib:/usr/lib…)的目录中找库文件
解决方法:
-L指定库的搜索路径
-L接一个库的搜索路径
-Llib:在当前目录下的lib目录下去查找库,-L后面也不需要空格,可以接多个-L

(4)cc main.c -Iinc -lfindmax -lsortarry -Llib
最后这一步就不会报警告了

(5)当我开始运行a.out文件的时候警告又出现了!
在这里插入图片描述

这是由于我没有把动态库加载到内存中去,运行a.out是时候它在内存中没找到我的libfindmax.so

动态库你必须记住的特定:
某一个工程编译的时候用到了某一个动态库中的函数,但是在编译完成后,并不会把用到的动态库的内容链接到可执行文件中去(a.out并没有具体函数的实现方法),仅仅是做了一个标记,表示在某一个地方用到了某某库
ldd a.out //检查a.out用到的库文件

后面括号里面的表示库文件相对于a.out在内存中的地址。由此可知确实.so库文件确实没在内存中
解决方法:
在运行的程序的时候,可以指定库的加载路径,linux中有一个环境变量
LD_LIBRARY_PATH load library path 加载库的路径
$环境变量 表示环境变量的值

四种方法设置环境变量:
1.临时性的 export 环境变量=$环境变量:你要添加的路径
//只对当前终端有效,关闭终端还得重新设置
2.写入/etc/profile
3.写入到家目录的.bashrc
4.写入到/etc/environment中
我这里采用第一种方法,只是做的一个简单的练练手,不想让他一直在内存中跑。

这时候程序就能完美的跑起来了!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值