.so文件的编译和调用

最近,在摸索一个开源项目,该项目是c++写的,为了能够使c++代码生成类似C#中.dll文件,然后直接的调用,我发现了.so文件有类似的用途。

文件后缀解释:

(1) .o,是目标文件,相对于windows中的.obj文件,它由.cpp文件编译生成,然后通过链接形成可执行文件。

(2) .so为共享库,是shared object,用于动态连接的,和dll差不多

(3) .a 为静态库,是好多个.o合在一起,用于静态连接

(4) .la为libtool自动生成的一些共享库,主要记录了一些配置信息。


接下来将举例来说明.so文件的生成和使用,下列例子有一个头文件:so_test.h,和3个.c文件:test_a.c, test_b.c, test_c.c,我们将这些文件编译成一个动态库:libtest.so

环境:linux环境

一.编译生成.so文件

so_test.h中的代码:

#include <stdio.h>
#include <stdlib.h>

void test_a();
void test_b();
void test_c();
test_a.c中的代码:

#include "so_test.h"
void test_a(){
	printf("this is in test_a...\n");
}
test_b.c中的代码:
#include "so_test.h"
void test_b(){
	printf("this is in test_b...\n");
}
test_c.c中的代码:

#include "so_test.h"
void test_c(){
	printf("this is in test_c...\n");
}
使用如下的命令将这几个文件编译成一个动态库:libtest.so

$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
二.链接动态库.so文件,并使用

通过上述的过程,我们已经了动态链接库libtest.so,下面我们通过test程序来调用这个库中的函数。该程序写在test.c中

test.c中的代码:

#include "so_test.h"
int main(){
	test_a();
	test_b();
	test_c();
	return 0;
}
通过如下命令,将test.c与动态库libtest.so链接生成可执行文件test:

$ gcc test.c -L. -ltest -o test
运行test

$ ./test
将会有如下的结果出现,说明libtest.so的编译和使用成功



三.使用Scons来编译

1.在和.c文件相同的目录下创建SConstruct文件,该文件是一个python文件,是Scons编译的一个入口,并在里面写入如下的编译命令生成.so文件libtest.so

SharedLibrary('libtest', ['test_a.c', 'test_b.c', 'test_c.c'])
2.将.so库文件与测试程序test.c链接成可执行文件

Program('test.c', LIBS=['libtest'], LIBPATH='.')
执行test的过程如上,其结果是一样的,但是使用Scons编译更加的便捷。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值