linux中把.c的文件编译成.so
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux中把.c的文件编译成.so相关的知识,希望对你有一定的参考价值。
linux中把.c的文件编译成.so的文件?例如Ubuntu中桌面有一个文件libst.c ,怎么把它编译成libst.so的文件呢?
就跟用VS编译dll或者lib文件差不多,把代码编译完成以后,命名为相应的后缀就好了。例如:
gcc -c -fPIC libst.c
生成 libst.o
然后
gcc -shared -fPIC -o libst.so libst.o
生成 libst.so 动态链接库
把libst.so拷贝到系统默认库目录下,比如 /lib, /usr/lib 下
假定有 test.c 要引用这个库
gcc -lst -o test test.c
然后就可以了
假如不能把libst.so拷贝到默认库目录下,比方说放在了
/home/aaa/lib 下
那么就用这样的语句来编译test.c
gcc -L/home/aaa/lib -lst -Wl,-rpath=/home/aaa/lib -o test test.c 参考技术A 首先
gcc -c -fPIC libst.c
生成 libst.o
然后
gcc -shared -fPIC -o libst.so libst.o
生成 libst.so 动态链接库
把libst.so拷贝到系统默认库目录下,比如 /lib, /usr/lib 下
假定你有 test.c 要引用这个库
gcc -lst -o test test.c
然后就可以了
假如不能把libst.so拷贝到默认库目录下,比方说放在了
/home/aaa/lib 下
那么就用这样的语句来编译test.c
gcc -L/home/aaa/lib -lst -Wl,-rpath=/home/aaa/lib -o test test.c 参考技术B linux中共享库以so为后缀(shared object),与Windows下的DLL类似,是在程序运行时动态连接。多个进程可以连接同一个共享库。
以下以编译mylib.c为例讲如何编译.so文件。
首先,编译mylib.c:
$gcc -c -fPIC -o mylib.o mylib.c
-c表示只编译(compile),而不连接。-o选项用于说明输出(output)文件名。gcc将生成一个目标(object)文件mylib.o。
注意-fPIC选项。PIC指Position Independent Code。共享库要求有此选项,以便实现动态连接(dynamic linking)。
生成共享库:
$gcc -shared -o mylib.so mylib.o
库文件以lib开始。共享库文件以.so为后缀。-shared表示生成一个共享库。
这样,共享库就完成了。.so文件和.h文件都位于当前工作路径(.)。
请问我有一个.so文件,如何在Linux下编程使用呢?
参考技术A-lxx
xx是你的.so文件名
其实使用方法和你使用数学库函数是一样的,源代码中添加
#include <math.h>,编译的时候,加上-lm参数。
注:linux下的.so文件为共享库,相当于windows下的dll文件。
扩展资料:
linux下编写调用so文件实例
.so是Linux(Unix)下的动态链接库. 和.dll类似.
比如:
文件有: a.c, b.c, c.c
gcc -c a.c
gcc -c b.c
gcc -c c.c
gcc -shared libXXX.so a.o b.o c.o
要使用的话也很简单. 比如编译d.c, 使用到libXXX.so中的函数, libXXX.so地址是MYPATH
gcc d.c -o d -LMYPATH -lXXX
注意不是-llibXXX
test.c文件和一个test.h,这两个文件要生成libsotest.so文件。然后我还有一个testso.c文件,在这个文件里面调用libsotest.so中的函数。
编写的过程中,首先是编译so文件,我没有编写makefile文件,而是参考的2里面说的直接写的gcc命令。
因为so文件里面没有main函数,所以是不可执行的,所以编译的时候要加上-c,只生成目标文件。
以上是关于linux中把.c的文件编译成.so的主要内容,如果未能解决你的问题,请参考以下文章
java jni 怎么在windows环境中编译成linux下的so文件
如何在Eclipse中如何用cygwin把C文件编译成so文件
ubuntu如何利用ndk-build生成.so文件?在终端输入显示没有那个文件或目录怎么办!!!