gcc 动态编译 动态库路径

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

代码如下:

[[email protected] 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 求和函数

代码如下:

[[email protected] 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 打印函数

代码如下:

[[email protected] 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 声明头文件

代码如下:

[[email protected] 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、编译动态库
[[email protected] shared]# gcc -fpic -shared add.c print.c -o libd.so
使用 -fpic -shared 参数生成 libd.so 动态库

2、生成执行文件
[[email protected] shared]# gcc main.c libd.so -o main
加载动态库,生成main执行文件

3、动态库加载
[[email protected] 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未找到

代码如下:

[[email protected] 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、把动态库路径添加到环境变量中
[[email protected]4-82-173-217 shared]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/c/shared/

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

3、直接复制到系统目录下
[[email protected] shared]# cp libd.so /lib/

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

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

时间: 2024-12-09 16:14:17

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

静态编译、动态编译、静态链接库和动态链接库理解

1.静态编译:编译器在编译可执行文件时,把需要用到的对应动态链接库(.so或.ilb)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行时不需要依赖于动态链接库. 2.动态编译: 动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令.所以其优点一 方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源.缺点一是哪怕是很简单的程序,只用到了链接 库中的一两条命令,也需要附带一个相对庞大的链接库:二是如果其他计算机上没有安装对应的运行库,

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

静态编译发布 你写了一个小型Qt程序,发布的时候不想要一大堆dll文件,就只想打包成一个exe文件,那么就需要用到静态编译. 下面的教程就是Qt静态编译环境配置 Qt5.6静态编译包下载地址 1.下载Qt5.6静态编译包,解压放在任意目录. 这里我放在了Qt文件下的Tools目录 2.打开Qt Creator -> 工具 -> 选项.. 3.点击Qt Versions添加静态编译包bin目录下的qmake文件. 4.点击 构建和运行 -> 构建套件(kit) -> 添加  5.注意

动态代理与动态编译

动态编程 动态编程是相对于静态编程而言,平时我们大多讨论的都是静态编程,java便是一种静态编程语言,它 的类型检查是在编译期间完成的.而动态编程是绕过了编译期间,在运行时完成类型检查.java有如下方法实现动态编程:动态代理,动态编译 动态代理: 动态代理在我在设计模式中已经介绍过了,主要是通过 Proxy类的newProxyInstance方法和接口InvocationHandler来实现动态代理.代理对象的的生产过程在这里简单说一下: 1.ProxyGenerator.generatePr

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

1, 动态的添加库路径.在程序运行过程中修改sys.path的值,添加自己的库路径import syssys.path.append(r'your_path') 2, 在Python安装目录下的\Lib\site-packages文件夹中建立一个.pth文件,内容为自己写的库路径.示例如下C:\Users\zqiguo\Desktop

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

一 代码 //add.h int add(int a, int b); //add.c int add(int a, int b) { return a+b; } //main.c #include <stdio.h> #include "add.h" void main() { printf("3 + 2 = %d\n",add(3+2)); } 二 多文件编译 1 生成.o文件 命令:gcc -c add.c main.c 生成:add.o,main

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

gcc 指定运行时动态库路径 Leave a reply 由于种种原因,Linux 下写 c 代码时要用到一些外部库(不属于标准C的库),可是由于没有权限,无法将这写库安装到系统目录,只好安装用户目录下如 /home/youname/lib,可是怎么编译才能让程序正常编译,并且正常运行呢.这样使用gcc:gcc -I/path/to/include/dir -L/path/to/lib/dir -llibname -Wl,-rpath,/path/to/lib/dir -o test test.

gcc -rpath 指定动态库路径

gcc -rpath 指定动态库路径 http://blog.csdn.net/v6543210/article/details/44809405

spdk dpdk编译动态库( shared library )

1,dpdk编译共享库 默认情况下都编译出静态库,如果想编译出动态库,把config/common_base文件中的CONFIG_RTE_BUILD_SHARED_LIB改成y即可. 2,spdk编译共享库 修改mk/spdk.common.mk: # Archive $(OBJS) into [email protected] (.so) # Archive $(OBJS) into [email protected] (.a) # LIB_C=\ #       $(Q)echo "  LI

C编译: 动态连接库 (.so文件)

转自:http://www.cnblogs.com/vamei/archive/2013/04/04/2998850.html 在“纸上谈兵: 算法与数据结构”中,我在每一篇都会有一个C程序,用于实现算法和数据结构 (比如栈和相关的操作).在同一个程序中,还有用于测试的main()函数,结构体定义,函数原型,typedef等等. 这样的做法非常不“环保”.算法的实际运用和算法的实现混在一起.如果我想要重复使用之前的源程序,必须进行许多改动,并且重新编译.最好的解决方案是实现模块化: 只保留纯粹的