Linux c动态链接库的生成及使用
2013-12-20 17:13
169 查看
(一)动态链接库的编译
首先定义头文件so_test.h,以及三个.c文件test_a.c,test_b.c,test_c.c,我们将这几个文件编译成动态链接库libtest.so;
so_test.h
#include "stdio.h"
void test_a();
void test_b();
void test_c();
test_a.c
#include "so_test.h"
void test_a()
{
printf("this is test_a...\n");
}
test_b.c
#include "so_test.h"
void test_b()
{
printf("this is test_b...\n");
}
test_c.c
#include "so_test.h"
void test_c()
{
printf("this is test_c...\n");
}
将上述几个文件编译成动态库:libtest.so
gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
编译参数说明:(gcc命令参数)
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
动态链接库生成后,下面说明如何使用它:
test.c
#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}
将test.c与动态库libtest.so链接生成可执行文件
gcc test.c -L. -ltest -o test
使用如下命令测试是如何调用链接库的:
ldd test
可以看到是否能找到动态库.
编译参数说明:
-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
然后运行./test,会发现出现如下错误:(运行的时候还是找不到动态库)
./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
可以通过如下方式来解决这个问题:
如果有root权限,可以直接将自己的库所在路径添加到/etc/ld.so.conf文件中。但一般这个文件中的内容都是一句“include /etc/ld.so.conf.d/*.conf”,因此最好在/etc/ld.so.conf.d/目录下新建一个文件 , 如“xxx.conf”,然后将自己的库所在路径添加到这个conf文件中。修改完文件后,以root身份运行 /sbin/ldconfig -v 。
如果没有root权限,则可以设置LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
在linux下设置LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=$PATH:$LD_LIBRARY_PATH
export方式在重启后会失效,所以可以在bashrc中修改LD_LIBRARY_PATH变量。
首先定义头文件so_test.h,以及三个.c文件test_a.c,test_b.c,test_c.c,我们将这几个文件编译成动态链接库libtest.so;
so_test.h
#include "stdio.h"
void test_a();
void test_b();
void test_c();
test_a.c
#include "so_test.h"
void test_a()
{
printf("this is test_a...\n");
}
test_b.c
#include "so_test.h"
void test_b()
{
printf("this is test_b...\n");
}
test_c.c
#include "so_test.h"
void test_c()
{
printf("this is test_c...\n");
}
将上述几个文件编译成动态库:libtest.so
gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
编译参数说明:(gcc命令参数)
-shared该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
动态链接库生成后,下面说明如何使用它:
test.c
#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}
将test.c与动态库libtest.so链接生成可执行文件
gcc test.c -L. -ltest -o test
使用如下命令测试是如何调用链接库的:
ldd test
可以看到是否能找到动态库.
编译参数说明:
-L.:表示要连接的库在当前目录中
-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
然后运行./test,会发现出现如下错误:(运行的时候还是找不到动态库)
./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
可以通过如下方式来解决这个问题:
如果有root权限,可以直接将自己的库所在路径添加到/etc/ld.so.conf文件中。但一般这个文件中的内容都是一句“include /etc/ld.so.conf.d/*.conf”,因此最好在/etc/ld.so.conf.d/目录下新建一个文件 , 如“xxx.conf”,然后将自己的库所在路径添加到这个conf文件中。修改完文件后,以root身份运行 /sbin/ldconfig -v 。
如果没有root权限,则可以设置LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
在linux下设置LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=$PATH:$LD_LIBRARY_PATH
export方式在重启后会失效,所以可以在bashrc中修改LD_LIBRARY_PATH变量。
相关文章推荐
- 使用TinyXML进行xml文件解析,生成xml文件
- 使用 intellij 生成 ant脚本 并利用命令生成war包
- ExtJs4.1:使用简单控件生成form
- eclipse+Java2WSDL+WSDL2Java 2012-12-06 12:32:43| 分类: j2ee |举报|字号 订阅 一、eclipse下如何用axis生成wsdl 可以使用
- 类加载机制与反射5——使用反射生成JDK动态代理
- java使用zxing生成带logo的二维码图片
- Generator生成代码的基本使用(使用idea)
- 使用zxing生成与解析qr二维码
- 使用Toad生成Oracle Scheduler Job DDL
- 使用PHP生成二维码(PHPQRCode)
- 使用itext生成pdf
- 使用PowerDesigner逆向生成数据库E-R图
- Git/Github使用笔记(一)——如何生成SSH key及访问Github
- 在Windows下编译sqlite3生成动态链接库并使用之
- Java/Flex使用相同密钥加密相同的信息,生成密文不同的解决方法
- 使用axis2的wsdl2java把wsdl生成java文件
- 使用Java生成word文档(附源码)
- “禁止在SQL Server中生成用户实例。请使用sp_configure'user instances enabled'生成用户实例”
- 使用PHP生成1000个随机注册码
- 在一个方法里生成了一个自动释放的数组,在另一个方法里使用它会导致程序崩溃。