文档章节

linux下 编译为动态链接库

NiuYoohoo
 NiuYoohoo
发布于 2017/05/21 17:00
字数 552
阅读 84
收藏 0

假如我想把以下的代码编译为动态库

/*code.c*/
#include <stdio.h>

void out()
{
	printf("::I am a dynamic library");
}

编译生产动态库

gcc code.c -fPIC -shared -o libcode.so
  • -fPIC  (Position-Independent Code)作用于编译阶段,在编译动态库时(.so文件)告诉编译器产生与位置无关代码。若未指定-fPIC选项编译.so文件,则在加载动态库时需进行重定向。对于我们的32位环境来说, 编译时是否加上-fPIC, 都不会对链接产生影响, 只是一份代码的在内存中有几个副本的问题(而且对于静态库而言结果都是一样的)。但在64位的环境下装载时重定位的方式存在一个问题,就是在我们的64位环境下用来进行位置偏移定位的。cpu指令只支持32位的偏移, 但实际中位置的偏移是完全可能超过64位的,所以在这种情况下编译器要求用户必须采用fPIC的方式进行编译的程序才可以在共享库中使用。
  • -shared 编译为共享库。
  • 输出库文件必须为lib+名字+.so

在代码中直接调用动态库接口

/*app.c*/
#include <stdio.h>

void out();

int  main()
{

printf("call library==>");
	out();
return 0;
}

调用动态库编译出可执行文件

gcc app.c -lcode -L. -o app
  • -l+库名(去除开头的lib)指明库的名称。
  • -L+库所在目录 (.表示当前目录)

运行载有动态库的程序

#如果直接运行
./app
./app: error while loading shared libraries: libcode.so: 
cannot open shared object file: No such file or directory
#出错了提示无法打开目标文件,这是因为动态库程序加载时会在LD_LIBRARY_PATH这个环境变量包含目录中去找加载的库,
#如果你当前编译的目录不是包含在这个环境变量中,那么就会产生这个错误。当然解决办法就是把当前编译的库目录包含到
#LD_LIBRARY_PATH中可以通过修改配置文件或者命令行的方式。
#如命令行方式 export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
#再次执行
./app
call library==>::I am a dynamic library

 

© 著作权归作者所有

共有 人打赏支持
NiuYoohoo
粉丝 1
博文 49
码字总数 18987
作品 0
赣州
私信 提问
vc++怎么编译生成.so的文件?

vc++怎么编译可以生成linux的使用的.so文件,我只知道vc++可以编译生成windows上的.dll的动态链接库,怎么生成linux下的.so的动态链接库? 谢谢指导。

xxdd
2013/06/25
5.9K
11
深入分析Windows和Linux动态库应用异同

摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 ...

晨曦之光
2012/03/02
83
0
[动态库]深入分析Windows和Linux动态库应用异同

摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 ...

龙宝宝
2011/08/05
0
0
编写易于扩展的 Makefile

前言 在开发 UNIX 平台下的软件时,为了使程序得到最佳优化往往需要使用平台原生的编译器及库文件。例如,为 AIX 平台开发的产品其中的 C++ 源程序往往使用 xlC_r 来编译连接。类似的 Linux ...

IBMdW
2011/08/26
431
0
关于Linux静态和动态链接库的创建及使用

和Windows系统一样Linux也有静态/动态链接库,下面介绍创建和使用方法: 假设有下面几个文件: 头文件String.h,声明相关函数原形,内容如下: Strlen.c:函数Strlen的实现,获取给定字符串的...

zt371
2009/05/08
581
0

没有更多内容

加载失败,请刷新页面

加载更多

携手开发者共建云生态 首届腾讯云+社区开发者大会在京举办

本文由云+社区发表 北京时间12月15日,由腾讯云主办,极客邦科技、微信、腾讯TEG协办的首届腾讯云+社区开发者大会在北京朝阳悠唐皇冠假日酒店举办。在会上,腾讯云发布了重磅产品开发者平台以...

腾讯云加社区
24分钟前
1
0
人工智能时代员工如何证明其IT工作价值

机器人可以取代你的工作吗?你能帮助机器人完成它的工作吗?如果你正在考虑自己的职业生涯以及今后将如何发展,那么应该询问自己这些问题了。 机器人可以取代你的工作吗?你能帮助机器人完成它的...

Linux就该这么学
25分钟前
1
0
CPU性能过剩提升乏力影响未来行业发展吗?

虽然CPU仍然在不断发展,但是它的性能已经不再仅仅受限于单个处理器类型或制造工艺上了。和过去相比,CPU性能提升的步伐明显放缓了,接下来怎么办,成为横亘在整个行业面前的大问题。 自201...

linuxCool
36分钟前
2
0
使用Autowired和Qualifier解决多个相同类型的bean如何共存的问题

注意: 实现类UserServiceImpl,MyUserServiceImpl 需要区分:@Service("userServicel") @Service("myUserService") https://blog.csdn.net/russle/article/details/80287763......

qimh
今天
4
0
SQL 语句使用to_char函数时,检索结果有空格

小疯在使用Oracle过程中,使用to_char函数检索表数据时发现检索结果前面会有一个空格,对后续开发有影响。问题很好解决,比较直接对可以做一下trim处理。但是小疯很疑惑为什么会有空格呢,于...

野小疯
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部