在windows下动态链接库是以.dll后缀的文件,而在Linux中,是以.so作后缀的文件。
动态链接库的好处就是节省内存空间。
1、Linux下创建动态链接库
在使用GCC编译程序时,只需加上-shared选项即可,这样生成的执行程序即为动态链接库。
例如有文件:hello.c x.h main.c
编译:gcc hello.c -fPIC -o libhello.so
其中-fPIC选项的作用是:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的,
所以动态载入时是通过代码拷贝的方式来满足不同的调用,而不能达到真正的代码段共享的目的.
将main.c与hello.so动态库gcc main.c -L. -lhello -o main
一、动态链接库
1.创建hello.so动态库
#include <stdio.h>
void hello(){
printf("hello world\n");
}
编译:gcc -fPIC -shared hello.c -o libhello.so
2.hello.h头文件
void hello();
3.链接动态库
#include <stdio.h>
#include "hello.h"
int main(){
printf("call hello()");
hello();
}
复制代码
编译:gcc main.c -L. -lhello -o main这里-L的选项是指定编译器在搜索动态库时搜索的路径,告诉编译器hello库的位置。"."意思是当前路径.
3.编译成够后执行./main,会提示:
In function `main": main.c.text+0x1d): undefined reference to `hello"collect2: ld returned 1 exit status这是因为在链接hello动态库时,编译器没有找到。
解决方法:
sudo cp libhello.so /usr/lib/这样,再次执行就成功输入:
call hello()
二、静态库
文件有:main.c、hello.c、hello.h
1.编译静态库hello.o:
gcc hello.c -o hello.o #这里没有使用-shared
2.把目标文档归档
ar -r libhello.a hello.o #这里的ar相当于tar的作用,将多个目标打包。程序ar配合参数-r创建一个新库libhello.a,并将命令行中列出的文件打包入其中。这种方法,如果libhello.a已经存在,将会覆盖现在文件,否则将新创建。
3.链接静态库
gcc main.c -lhello -L. -static -o main这里的-static选项是告诉编译器,hello是静态库。
或者:
gcc main.c libhello.a -L. -o main这样就可以不用加-static
4.执行./main
输出:call hello()
三、借助自带的ldd实现程序来分析动态库搜索情况
ldd main
结果:
linux-gate.so.1 => (0x00efd000)
libhello.so => /usr/lib/libhello.so (0x00f6b000)
libc.so.6 => /lib/libc.so.6 (0x001a5000)
/lib/ld-linux.so.2 (0x00eb8000)
如果目标程序没有链接动态库,则打印“not a dynamic executable”
分享到:
相关推荐
GCC编译动态和静态链接库.pdf 学习资料 复习资料 教学资源
Linux系统下使用gcc 5.3编译器编译的boost库1.68版本的动态库和静态库,多线程参数编译,经测试可用
默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,...
转载的gcc编译方法,开发时老是忘记,作为资源吧,省得找了。
函数库分为静态库和动态库两种。 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库...
Linux 如何使用gcc生成静态库和动态库,使用GCC编译生成静态库和动态库的方法
本代码是在VS2005下编译产生的CJson为静态库文件,编译测试通过,方便大家使用(看了网上很多的例程都不能使用,自动动手编写的),本编译的文件是CJSON的库文件cjson.c,可以去官方下载
1、二者均需要由.o文件生成,二者前缀均为lib,静态库后缀以 .a,动态库的后缀以.so 2、生成目标可执行文件后,静态库可以直接删除,因为静态库已经被加载到可...3、当静态库和动态库同名时, gcc命令将优先使用动态库
2 静态库和动态库的比较 链接静态库其实从某种意义上来说也是一种粘贴复制,只不过它操作的对象是目标代码而不是源码而已。因为静态库被链接后库就直接嵌入可执行文件中了,这样就带来了两个问题。 首先就是系统空间...
静态库的制作:(inc/lib/src/main.c) gcc -c src/*.c(编译src目录下的.c文件生成.o文件) ar rs libmath.a *.o(生成静态库:libmath.a(命名规则:必须以lib开头,以.a结尾,中间是库名:math)) 静态库的使用: gcc main.c -...
在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成...
ubuntu12.04 32位下gcc4.6.3编译glibc-2.15版本静态库文件,包内一个源码,一个编译后
gcc编译动态和静态链接库.pdf,教你如何编译和使用库,提高程序的理解力
linux下编译/交叉编译openssl-1.1.1g生成动态库和静态库方法: 一、编译linux版本 1. cp openssl-1.1.1g.tar.gz /opt/ 2. tar -zxvf openssl-1.1.1g.tar.gz 3. mkdir build 4. ./config --prefix=/opt/openssl-1.1.1...
1.编译生成静态库 gcc -c libdemo.c -o libdemo.o ar rcs libdemo.a libdemo.o gcc testdemo.c -o testdemo -static -L. -ldemo 运行: ./testdemo
默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 ubuntu 下使用 gcc 4.8.5 + cmake 3.28 编译,包含 bin, include, lib, lib64, share 五个目录,可以...
源码经过编译生成对象文件,对象文件进一步处理可以生成可执行程序或者库文件。...对于可执行程序和动态库,此“进一步处理”指的是“链接”,使用gcc命令。 对于静态库,此“进一步处理”指的是“打包”,使用ar命令。
附件中文件解压后可直接使用,win7 ,gcc 4.9.2以上编译。 编译过程中libcurl, zlib未作修改 openssl更改了test下几个文件,使用tdm-gcc 5.1.0编译 libssh2在github上下的源码,更改openssl.h文件,使用cmake编译 ...
zlib源代码以及编译好的win32动态库静态库,支持win32工程。直接使用。