文档章节

linux下 编译为动态链接库

NiuYoohoo
 NiuYoohoo
发布于 2017/05/21 17:00
字数 552
阅读 51
收藏 0

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

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

 

© 著作权归作者所有

共有 人打赏支持
NiuYoohoo
粉丝 1
博文 49
码字总数 18987
作品 0
赣州
[动态库]深入分析Windows和Linux动态库应用异同

摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 ...

龙宝宝
2011/08/05
0
0
linux 静态库的生成与使用

库是一种软件组件技术,库里面封装了数据和函数。 库的使用可以使程序模块化。 Windows系统包括静态链接库(.lib文件)和动态链接库(.dll文件)。 Linux通常把库文件存放在/usr/lib或/lib目...

markqk
2014/02/12
0
0
Linux GCC编译使用动态、静态链接库

在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件。 动态链接库的好处就是节省内存空间。 1、Linux下创建动态链接库 在使用GCC编译程序时,只需加上-shared选项即...

rivsidn
05/09
0
0
Mac OS X中的JNI调用和实现

网上给出的在Windows和Linux操作系统下的JNI编程教程很多,其实无论在哪个系统中都是相似的步骤。总结如下: 编写Java程序文件,要使用调用本地库的类需在static初始化块内使用System.loadLi...

姚思远
2014/04/14
0
2
linux 下动态链接库的制作与使用

linux 下动态链接库的制作与使用 linux 下动态链接库的制作与使用 动态链接库.so的编译与使用- - 动态库.so在linux下用c和c++编程时经常会碰到,最近在网站找了几篇文章介绍动态库的编译和链...

李东委
2014/10/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

1、Vue解决安卓4.4不兼容的问题

1.npm安装 npm install babel-polyfill--save-devnpm install es6-promise--save-dev package.json中会出现 "babel-polyfill": "^6.26.0","es6-promise": "^4.1.1", 2.main.js引入 impo......

阿K1225
13分钟前
0
0
mybatis generator 属性详解

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis......

太黑_thj
16分钟前
1
0
windows nvm 安装 node

nvm 是 node 的版本控制管理 下面是下载 nvm 的地址,选择 nvm-setup.zip 下载 https://github.com/coreybutler/nvm-windows/releases 就是下一步下一步,一键安装 基本命令有: nvm arch [32...

U_I_A_N
18分钟前
0
0
js判断字符串中是否包含某个字符串

indexOf() indexof()方法可以返回某个指定的字符串值在字符串中首次出现的位置。如果要检索的字符串值没有出现,则该方法返回-1。 var str = "123";console.log(str.indexOf("3") != -1);...

小星星_cjx
31分钟前
0
0
函数式组件完整例子

之前创建的组件是比较简单,没有管理或者监听任何传递给他的状态,也没有生命周期方法。它只是一个接收参数的函数。 在下面这个例子中,我们标记组件为 functional,这意味它是无状态 (没有响...

tianyawhl
34分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部