linux下 编译为动态链接库
linux下 编译为动态链接库
NiuYoohoo 发表于7个月前
linux下 编译为动态链接库
  • 发表于 7个月前
  • 阅读 22
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

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

/*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

 

共有 人打赏支持
粉丝 2
博文 45
码字总数 18114
×
NiuYoohoo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: