linux下 编译为动态链接库
2017-05-21 00:00
197 查看
假如我想把以下的代码编译为动态库
-fPIC (Position-Independent Code)作用于编译阶段,在编译动态库时(.so文件)告诉编译器产生与位置无关代码。若未指定-fPIC选项编译.so文件,则在加载动态库时需进行重定向。对于我们的32位环境来说, 编译时是否加上-fPIC, 都不会对链接产生影响, 只是一份代码的在内存中有几个副本的问题(而且对于静态库而言结果都是一样的)。但在64位的环境下装载时重定位的方式存在一个问题,就是在我们的64位环境下用来进行位置偏移定位的。cpu指令只支持32位的偏移, 但实际中位置的偏移是完全可能超过64位的,所以在这种情况下编译器要求用户必须采用fPIC的方式进行编译的程序才可以在共享库中使用。
-shared 编译为共享库。
输出库文件必须为lib+名字+.so
在代码中直接调用动态库接口
-l+库名(去除开头的lib)指明库的名称。
-L+库所在目录 (.表示当前目录)
/*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
相关文章推荐
- 在linux gcc 64位平台编译动态链接库时出现的问题
- Linux下编译动态链接库
- linux下 将静态链接库编译成动态链接库
- linux 编译c程序与动态链接库
- linux下编译动态链接库的一个小例子
- LINUX下简单的编译和使用动态链接库[compile .so use c++ in linux]
- Linux编译动态链接库和使用
- linux动态链接库编译(转载)
- 编译链接------Linux环境下c语言静态链接库和动态链接库创建和使用
- Linux 编译静态链接库与动态链接库的方法
- linux 编译静态链接库和动态链接库
- LINUX下简单的编译和使用动态链接库[compile .so use c++ in linux]
- linux程序安装包----动态链接库的自动编译与安装
- linux编译静态库和动态链接库
- linux下编译动态链接库的一个小例子
- linux下gcc编译可执行程序时,添加动态链接库加载路径
- linux 动态链接库编译
- 【基础知识】linux c 编译链接运行、动态链接库
- 老生常谈--关于Linux下编译和使用动态链接库静态链接库
- Linux编译cximage生成动态链接库