linux编译库连接,linux下 编译为动态链接库

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

/*code.c*/

#include

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值