假如我想把以下的代码编译为动态库
/*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