您的位置:首页 > 运维架构 > Linux

linux下 编译为动态链接库

2017-05-21 00:00 197 查看
假如我想把以下的代码编译为动态库

/*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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  .so dynamic library fPIC