编译链接和动静态库
来源:百度文库 编辑:神马文学网 时间:2024/10/01 10:47:28
程序的预处理、编译、链接都可以由gcc完成,gcc会自动调用cpp来做预处理,ld来进行链接。其中对库的链接是很重要的一部分,有静态库和动态库两种,静态库以 .a 为后缀,ld会把静态库中的代码拷到待链接的程序中,形成完整的可执行的程序。而链接动态库生成可执行程序又分为静态调用和动态调用,静态调用是在程序中包含头文件直接调用库函数,也叫显式调用,程序被加载的同时也加载了库,在加载时完成真正的地址链接。而动态调用则不需要包含头文件,在程序中使用库加载函数dlopen来加载库,使用dlsym来获取所需函数的地址,所以是在需要时才加载动态库,也是隐式调用。这样编译时和库就没有关系,不需要链接了。对各种方式都给个实例就比较好理解了
使用库主要是为了实现代码的共享,所以一些能共用的函数放在一起写成库就最好了。
先vi add.c 代码为int add(int x,int y)
{
return x+y;
}
int sub(int x,int y)
{
return x-y;
}然后 vi add.h 代码为int add(int x,int y);
int sub(int x,int y);需要把 add.c 编译成.o文件,然后再用 ar 命令生成静态库
gcc -c add.c
ar -rc libadd.a add.o 遵循静态库命名的规则 lib + 名字 + .a下来可以编写测试文件test.c
#include
#include "add.h"
void main()
{
printf("add(5,4) is %d\n",add(5,4));
printf("sub(5,4) is %d\n",sub(5,4));
}编译 gcc -o test test.c -ladd -L.
没有把libadd.a放到库搜索路径中,所以要加-L.表示当前目录。
把add.c编译成动态链接库
gcc -shared -o libadd.so add.c
同样的编译test.c
gcc -o test test.c -ladd -L.
运行提示找不到 libadd.so ,把它copy到 /lib 中,运行成功了
显然我们只给出了链接是的路径是当前目录,不过运行时找不到,说明运行时加载库是有
另外的路径的,不过在 /lib 和 /usr/lib 中肯定没问题,当然也可以添加环境变量来添加
LIBRARY_PATH="your lib path"
export LD_LIBRARY_PATH (ms这个好像还不好用,不管了吧)静态库和动态库同时存在,首先链接的是动态库,gcc有指定链接动静态库的选项。使用ldd可以查看程序依赖的动态库
ldd test下面来看看真正的动态调用动态链接库的test.c#include
#include
void main()
{
int (*add)(int x,int y);
int (*sub)(int x,int y);
void *libptr;
libptr=dlopen("./libadd.so",RTLD_LAZY); //加载动态库
add=dlsym(libptr,"add"); //获取函数地址
sub=dlsym(libptr,"sub");
printf("add(5,4) is %d\n",add(5,4));
printf("sub(5,4) is %d\n",sub(5,4));
dlclose(libptr);
}编译: gcc -o test -ldl test.c 嘿嘿,要链接libdl.so库才可以用这些函数哦这样就动态按需加载了,不需要包含该库的头文件了
这些都和windows中是一样的嘛 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dansen_xu/archive/2007/08/29/1764618.aspx
使用库主要是为了实现代码的共享,所以一些能共用的函数放在一起写成库就最好了。
先vi add.c 代码为int add(int x,int y)
{
return x+y;
}
int sub(int x,int y)
{
return x-y;
}然后 vi add.h 代码为int add(int x,int y);
int sub(int x,int y);需要把 add.c 编译成.o文件,然后再用 ar 命令生成静态库
gcc -c add.c
ar -rc libadd.a add.o 遵循静态库命名的规则 lib + 名字 + .a下来可以编写测试文件test.c
#include
#include "add.h"
void main()
{
printf("add(5,4) is %d\n",add(5,4));
printf("sub(5,4) is %d\n",sub(5,4));
}编译 gcc -o test test.c -ladd -L.
没有把libadd.a放到库搜索路径中,所以要加-L.表示当前目录。
把add.c编译成动态链接库
gcc -shared -o libadd.so add.c
同样的编译test.c
gcc -o test test.c -ladd -L.
运行提示找不到 libadd.so ,把它copy到 /lib 中,运行成功了
显然我们只给出了链接是的路径是当前目录,不过运行时找不到,说明运行时加载库是有
另外的路径的,不过在 /lib 和 /usr/lib 中肯定没问题,当然也可以添加环境变量来添加
LIBRARY_PATH="your lib path"
export LD_LIBRARY_PATH (ms这个好像还不好用,不管了吧)静态库和动态库同时存在,首先链接的是动态库,gcc有指定链接动静态库的选项。使用ldd可以查看程序依赖的动态库
ldd test下面来看看真正的动态调用动态链接库的test.c#include
#include
void main()
{
int (*add)(int x,int y);
int (*sub)(int x,int y);
void *libptr;
libptr=dlopen("./libadd.so",RTLD_LAZY); //加载动态库
add=dlsym(libptr,"add"); //获取函数地址
sub=dlsym(libptr,"sub");
printf("add(5,4) is %d\n",add(5,4));
printf("sub(5,4) is %d\n",sub(5,4));
dlclose(libptr);
}编译: gcc -o test -ldl test.c 嘿嘿,要链接libdl.so库才可以用这些函数哦这样就动态按需加载了,不需要包含该库的头文件了
这些都和windows中是一样的嘛 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dansen_xu/archive/2007/08/29/1764618.aspx
编译链接和动静态库
动态链接库和静态链接库的区别
静态链接库LIB和动态链接库DLL的区别 创建和示例
静态链接库LIB和动态链接库DLL的区别 创建和示例
linux中编译静态库(.a)和动态库(.so)的基本方法
解决QT静态编译和debug库问题(mingwm10.dll丢失、collect2:ld ...
VS2010 静态编译
linux静态链接库与动态链接库的区别及动态库的创建
linux静态链接库与动态链接库的区别创建
在Symbian开发环境下如何编写静态接口DLL(动态链接库)
Linux怎样编写和编译动态库
用gcc编译生成动态链接库*.so文件的方法
静态编译QT4 - 舒心一刻 - JavaEye技术网站
静态数据成员和静态函数成员
精美动、静态LOGO模板(二)
精美动、静态LOGO模板(三)
精美动、静态LOGO模板(四)
静态库(.a)和动态库(.so)的基本方法
关于Linux静态库和动态库的分析 分析 动态 静态 关于 连接 程序 文件 一个 使用 ...
静态和动态鲜花mt
静态和动态鲜 花
动态库 静态库
精美动、静态LOGO模板460款(一)
linux宝库/编程技术/创建和使用库:静态、共享和动态