linux下使⽤gcc编译so库
最近公司在做端的定位和导航,所以需要云端提供导航和定位功能,为了复⽤之前客户端的代码,所以我需要把c⽂件编译成linux下可以运⾏的so库,记录⼀下过程。
由于没有搞过,所以遇到问题也不知道具体是哪⾥的问题,所以就⼀路乱试。。。最后试了下,可以⽤。
⽤到的⼀些gcc命令
-shared:指定⽣成动态连接库,不⽤该标志外部程序⽆法连接。相当于⼀个可执⾏⽂件(我开始没加这个,报错不到main)
-fPIC:表⽰编译为位置独⽴的代码,不⽤此选项的话编译后的代码是位置相关的所以动态载⼊时是通过代码拷贝的⽅式来满⾜不同进程的需要,⽽不能达到真正代码段共享的⽬的。
-I:指定头⽂件所在的⽂件夹
遇到的问题
编译时报错:不到jni.h
我⽤虚拟机装了Ubuntu,输⼊java没有到,然后按着提⽰随便装了⼀个。。。
当然我现在知道装的是OpenJDK(OpenJDK和SunJDK的区别),google也决定在android N中使⽤OpenJDK了(相关报道)。。
所以我⼜下载了SunJDK,编译的时候要引⽤相关⽂件,加如下命令
-I /[jdk⽬录]/include -I /[jdk⽬录]/include/linux
[jdk⽬录]/include是jni.h所在⽬录;
[jdk⽬录]/include/linux是jni_md.h所在⽬录
编译报错:不到m a in
没有加命令 -shared(命令介绍参考上⾯)
编译时报错:不到m a th.h
使⽤math.h中声明的库函数,gcc命令⾏必须加-lm选项,因为数学函数位于libm.so库⽂件中(这些库⽂件通常位于/lib⽬录下),-lm选项告诉编译器,我们程序中⽤到的数学函数要到这个库⽂件⾥。
虚拟机linux安装jdk我最后是把c⽂件⼀个⼀个编译成.o然后,然后在编译成.so的,因为怕出错,不知道哪个⽂件的问题。。。当然也可以直接⼀句话如下:
gcc [.c⽂件,多个⽤空格隔开] -fPIC -shared -I /usr/xxx/include -I /usr/xxx/include/linux -lm -o libtest.so
多个c⽂件也可以使⽤ lib/*.c的⽅式
编译成.o命令:gcc -c test.c
.o编译成.so:gcc test.o -o test(默认会添加lib前缀和.so后缀)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论