实现将.c文件编译成.so文件的过程可以分为以下几步:
-
编写C文件
使用文本编辑器或者集成开发环境编写一个C程序代码文件,后缀为.c。该C文件可以包含定义函数、结构体、变量等内容。 -
编译生成目标文件
使用gcc命令将C文件编译生成目标文件,即.o文件,可使用如下命令:
gcc -fPIC -c example.c -o example.o
其中,-c选项表示仅进行编译不进行链接,-fPIC选项表示生成位置无关的代码,这是生成动态链接库必须要用的选项。
- 生成动态链接库
将.o文件生成动态链接库的命令如下:
gcc -shared -o libexample.so example.o
其中-shared选项指示生成动态链接库, -o选项指示输出文件名,libexample.so指示输出文件的名称,example.o表示输入文件,即编译生成的目标文件。
- 拷贝动态链接库文件至默认库路径
将动态链接库文件拷贝至默认库路径,一般在/usr/lib或/lib目录下:
sudo cp libexample.so /usr/lib/
例如,我编写了一个名为test.c的C文件,其中定义了一个名为add的函数,接受两个整型参数,计算他们的和并返回。具体代码如下:
#include <stdio.h>
int add(int a, int b){
return a + b;
}
为了将该C文件编译成.so文件,首先需要在终端输入以下命令,对代码进行编译生成.o文件:
gcc -fPIC -c test.c -o test.o
然后使用以下命令将.o文件编译生成.so文件,并将.so文件拷贝至默认库路径:
gcc -shared -o libtest.so test.o
sudo cp libtest.so /usr/lib/
这样,在其他程序中使用该函数时,可以在代码中引入该动态链接库:
#include<stdio.h>
#include<dlfcn.h>
int main()
{
void *handle;
int (*add)(int,int);
handle = dlopen("/usr/lib/libtest.so", RTLD_LAZY);
if(!handle){
printf("%s\n",dlerror());
return 1;
}
add = dlsym(handle, "add");
printf("the result of add(1,1) = %d\n",(*add)(1,1));
dlclose(handle);
return 0;
}
这是一个使用动态链接库中的函数的例子。需要注意的是,dlopen函数载入动态链接库时需要指出动态链接库的名字,即在上面的例子中载入的就是libtest.so,该文件名也可以改成其他名字。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linux中把.c的文件编译成.so文件 - Python技术站