Linux嵌入式开发-海思3516平台(三)-生成静态动态库
前言:
在平常的项目开发中我们编写的程序往往可能需要提供给别人使用,我们提供给第三方使用时可能就需要封装成SDK来供别人使用,在我们所有使用的IDE中都集成有封装成函数库的人机交互界面,因为这些IDE的基本编译工具都是GCC,下面我们就看下如何在Linux下使用GCC将我们的文件编译成静态库或者动态库吧。
一、生成静态库
生成静态库最终的文件是.a文件主要经过如下几个步骤:
1、先用我们需要的工具生成o文件,表示我们的源文件没有语法错误,可以使用makefile文件管理,也可以使用GCC命令如下:
arm-himix200-linux-gcc -c -o gpio.o gpio.c生成的o文件如下:
2、接着我们使用指令将我们生成的o文件转换为静态库:
arm-himix200-linux-ar crs gpio.a gpio.o(这里可以使用多个o文件具有调用关系的)生成的静态库文件如下:
3、调用我们生成的静态库文件
arm-himix200-linux-gcc -o mian.o gpio.a如果我们的a文件不在我们这个目录下后面需要加-L/目录/gpio.a
二、生成动态库文件
1、首先依旧是生成o文件,我们可以通过如下命令生成o文件或者通过makefile文件生成:
arm-himix200-linux-gcc -c -o main.o main.c
2、然后使用o文件来生成我们需要的so动态库文件:
arm-himix200-linux-gcc -shared -o main.so main.o
生成的动态库文件如下:
三、注意事项
1、出错第一次生成动态库不成功的原因报错如下,说的是需要我加-fPIC选型,所以在生成o文件的时候我们需要加入这个选项,报错情况如下,希望大家借鉴:
2、解决:编译时需要arm-himix200-linux-gcc -fPIC-shared -o main.o main.c这样编译才有效或者是在make文件中CFLAGS += -fPIC添加这个编译选型,这样再来生成库就不会报错了。
3、这个fPIC是个什么选项(摘自网上):
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
gcc -shared -fPIC -o 1.so 1.c
PIC使.so文件的代码段变为真正意义上的共享
如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置.也就是不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)。
- 分享
- 举报
-
浏览量:3931次2020-07-17 16:50:14
-
浏览量:1596次2020-08-19 16:35:48
-
浏览量:1726次2020-08-19 16:43:27
-
浏览量:2445次2020-08-20 18:03:14
-
浏览量:2745次2024-01-25 15:00:06
-
浏览量:2015次2020-08-20 18:00:36
-
浏览量:1333次2024-01-22 17:02:06
-
浏览量:980次2024-01-24 16:33:36
-
浏览量:1033次2024-02-04 10:08:58
-
浏览量:2408次2020-06-03 16:23:42
-
浏览量:1940次2020-08-03 11:18:53
-
浏览量:8973次2019-09-01 11:08:57
-
浏览量:2529次2020-08-20 17:57:43
-
浏览量:2512次2020-08-19 16:46:46
-
浏览量:3093次2020-08-20 17:58:22
-
浏览量:2719次2018-01-25 10:32:15
-
浏览量:2376次2020-08-17 18:01:42
-
浏览量:2064次2020-08-03 11:21:38
-
浏览量:2145次2020-08-17 18:04:26
-
广告/SPAM
-
恶意灌水
-
违规内容
-
文不对题
-
重复发帖
圈圈
感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明