gcc 动态编译(共享库) 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令
优点:体积小,编译快
缺点:依赖性高

代码如下:

[root@74-82-173-217 shared]# cat add.c
int add (int x, int y) {
return x + y;
}

Parsed in 0.007 seconds at 12.13 KB/s
add.c 求和函数

代码如下:

[root@74-82-173-217 shared]# cat print.c
#include <stdio.h>
void print (int x) {
printf ("%d\n",x);
}

Parsed in 0.007 seconds at 14.78 KB/s
print 打印函数

代码如下:

[root@74-82-173-217 shared]# cat head.h
#ifndf HEAD_H
#define HEAD_H
int add (int ,int);
void print (int);
#endif

Parsed in 0.007 seconds at 16.34 KB/s
head.h 声明头文件

代码如下:

[root@74-82-173-217 shared]# cat main.c
#include <stdio.h>
#include "head.h"
int main () {
int x = add(3, 5);
print(x);
}

Parsed in 0.007 seconds at 19.70 KB/s
main.c 主函数

1、编译动态库
[root@74-82-173-217 shared]# gcc -fpic -shared add.c print.c -o libd.so
使用 -fpic -shared 参数生成 libd.so 动态库

2、生成执行文件
[root@74-82-173-217 shared]# gcc main.c libd.so -o main
加载动态库,生成main执行文件

3、动态库加载
[root@74-82-173-217 shared]# ./main
./main: error while loading shared libraries: libd.so: cannot open shared object file: No such file or directory
因为我们是以动态库编译,执行main时由于找不到 libd.so 库导致执行失败,可以使用 ldd main来查看 libd.so未找到

代码如下:

[root@74-82-173-217 shared]# ldd main
linux-gate.so.1 => (0x0070c000)
libd.so => not found
libc.so.6 => /lib/i686/nosegneg/libc.so.6 (0x0050e000)
/lib/ld-linux.so.2 (0x00ea6000)

Parsed in 0.000 seconds at 434.42 KB/s
解决此问题有三种方法,
1、把动态库路径添加到环境变量中
[root@74-82-173-217 shared]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/c/shared/

2、把动态库路径添加到 ld.so.conf中
[root@74-82-173-217 shared]# echo "/root/c/shared" >> /etc/ld.so.conf
[root@74-82-173-217 shared]# ldconfig
重新搜索所有动态库,并更新到 /etc/ld.so.cache
[root@74-82-173-217 shared]# ldconfig -v|grep libd.so
查找当前是否包含 libd.so 库

3、直接复制到系统目录下
[root@74-82-173-217 shared]# cp libd.so /lib/

gcc参数
-shared:
该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

-fpic:
表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

gcc 动态编译 动态库路径的更多相关文章

  1. OpenCV:Debug和Release模式 && 静态和动态编译

    1.Release和Debug的区别 Release版称为发行版,Debug版称为调试版. Debug中可以单步执行.跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢.Release版运行速度较 ...

  2. Qt 静态编译发布和动态编译发布

    静态编译发布 你写了一个小型Qt程序,发布的时候不想要一大堆dll文件,就只想打包成一个exe文件,那么就需要用到静态编译. 下面的教程就是Qt静态编译环境配置 Qt5.6静态编译包下载地址 1.下载 ...

  3. ASP.NET Core Razor 视图预编译、动态编译

    0x01 前言 ASP.NET Core在默认发布情况下,会启动预编译将试图编译成xx.Views.dll,也许在视图中打算修改一处很细小的地方我们需要再重新编译视图进行发布.下面我将从 ASP.NE ...

  4. 关于HotSpot VM以及Java语言的动态编译 你可能想知道这些

    目录 1 HotSpot VM的历史 2 HotSpot VM 概述 2.1 编译器 2.2 解释器 2.3 解释型语言 VS 编译型语言 3 动态编译 3.1 什么是动态编译 3.2 HotSpot ...

  5. Java学习:注解,反射,动态编译

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解  什么是注解 ? Annotat ...

  6. windows7下python3.4.3 添加库路径(转)

    1, 动态的添加库路径.在程序运行过程中修改sys.path的值,添加自己的库路径import syssys.path.append(r'your_path') 2, 在Python安装目录下的\Li ...

  7. Linux gcc编译(动态库,静态库)

    1. linux 库路径: /lib , /usr/lib , /usr/local/lib 2.linux 编译静态库 a.编写源文件vi pr1.c void print1(){    print ...

  8. 转: gcc 指定运行时动态库路径

    gcc 指定运行时动态库路径 Leave a reply 由于种种原因,Linux 下写 c 代码时要用到一些外部库(不属于标准C的库),可是由于没有权限,无法将这写库安装到系统目录,只好安装用户目录 ...

  9. GCC实现多文件编译,静态库,动态库

    一 代码 //add.h int add(int a, int b); //add.c int add(int a, int b) {     return a+b; } //main.c #incl ...

随机推荐

  1. <Android 应用 之路> 干货集中营 ~ GankIOClient

    简介 利用干货集中营 , daimajia和他的小伙伴给我们开发者带来的福利开发的一个干货集中营客户端,主要功能在阅读干货上. Github地址: https://github.com/onlylov ...

  2. 声明元素<%! %>、Scriptlet元素<% %>、表达式元素<%= %>、注释元素、输出特殊符号<%和%>

    声明元素 <%! 类成员声明或方法声明 %> 在声明元素中编写的代码,将转译为Servlet中的类成员或方法. 重新定义jspInit()方法,或是在jspDestroy(),就是在声明元 ...

  3. 联想ThinkPadE455实现FN禁用(F1-F12标准功能与特殊功能切换)

    系统:Win7 64 位     机型:联想ThinkPadE455笔记本 方法一:键盘Fn热键切换功能(亲测可用) Fn+Esc   FnLk  组合键方法启用或禁用Fn锁定功能 具体说明(这个逻辑 ...

  4. 您还在用下一步下一步的方式安装SQLSERVER和SQLSERVER补丁吗?

    您还在用下一步下一步的方式安装SQLSERVER和SQLSERVER补丁吗? 介绍 假如你有50台服务器需要安装SQLSERVER,如果你用下一步下一步的方式,用远程桌面不停切换,那个效率... 大家 ...

  5. SQLSERVER中的元数据锁

    SQLSERVER中的元数据锁 网上对于元数据锁的资料真的非常少 元数据锁一般会出现在DDL语句里 下面列出数据库引擎可以锁定的资源 资源 说明 RID 用于锁定堆(heap)中的某一行 KEY 用于 ...

  6. linq not in 查询

    想要的sql: select A.* from BL_BCSS_Invoice A join BL_BCSS_OfflineInvoice B on A.ID!=B.InvoiceID; 不知道如何写 ...

  7. MSSQL在线文件还原脚本

    在线文件还原:如果比较大的MSSQL数据库的损坏只是集中在其中某一个文件或者文件组上,使用在线文件还原技术,只是把坏掉的数据文件或者文件组重建,能节约很多时间.以下是测试脚本(假设损坏的文件时Trn0 ...

  8. 配置jboss EAP 6.4 数据库连接超时时间

    Environment Red Hat JBoss Enterprise Application Platform (EAP) 6.x 7.x Issue Server throws followin ...

  9. Android开发中使用七牛云存储进行图片上传下载

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...

  10. oracle数据库中如何去除空格

    目前,我所知道的就有两种方法: 一.trim(a)--只能去除字符串左右的空格 select trim(leading from ' ——11—— ') aa from dual; select tr ...