`

gcc 编译动态库和静态库 2

 
阅读更多

在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

    GCC编译动态和静态链接库.pdf 学习资料 复习资料 教学资源

    boost库1.68版本Linux下编译的动态库和静态库

    Linux系统下使用gcc 5.3编译器编译的boost库1.68版本的动态库和静态库,多线程参数编译,经测试可用

    grpc-1.30.2 Linux 编译静动态库

    默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 centos 7 下使用 gcc 4.8.5 + cmake 3.16.9 编译,包含 bin, include, lib, lib64, share 五个目录,...

    gcc编译动态和静态链接库

    转载的gcc编译方法,开发时老是忘记,作为资源吧,省得找了。

    gcc生成静态库和动态库

    函数库分为静态库和动态库两种。 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库...

    Linux 如何使用gcc生成静态库和动态库

    Linux 如何使用gcc生成静态库和动态库,使用GCC编译生成静态库和动态库的方法

    VS2005 下编译的cjson的静态库和动态库文件

    本代码是在VS2005下编译产生的CJson为静态库文件,编译测试通过,方便大家使用(看了网上很多的例程都不能使用,自动动手编写的),本编译的文件是CJSON的库文件cjson.c,可以去官方下载

    动态库与静态库的区别.pptx

    1、二者均需要由.o文件生成,二者前缀均为lib,静态库后缀以 .a,动态库的后缀以.so 2、生成目标可执行文件后,静态库可以直接删除,因为静态库已经被加载到可...3、当静态库和动态库同名时, gcc命令将优先使用动态库

    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 -...

    Linux下g++编译与使用静态库和动态库的方法

    在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成...

    glibc-2.15静态&动态库文件及源码(gcc4.6.3编译)

    ubuntu12.04 32位下gcc4.6.3编译glibc-2.15版本静态库文件,包内一个源码,一个编译后

    动态和静态链接库

    gcc编译动态和静态链接库.pdf,教你如何编译和使用库,提高程序的理解力

    openssl-1.1.1g编译、交叉编译方式.rar

    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

    gRPC-1.62.1 Linux 编译静动态库

    默认编译是静态库,但考虑到 linux 上动态库使用较多,所以使用 -DBUILD_SHARED_LIBS=ON 参数编译为动态库。 在 ubuntu 下使用 gcc 4.8.5 + cmake 3.28 编译,包含 bin, include, lib, lib64, share 五个目录,可以...

    静态库和动态库:.doc

    源码经过编译生成对象文件,对象文件进一步处理可以生成可执行程序或者库文件。...对于可执行程序和动态库,此“进一步处理”指的是“链接”,使用gcc命令。 对于静态库,此“进一步处理”指的是“打包”,使用ar命令。

    libcurl.a(with zlib, openssl , libssh2) 含release静态库和动态库, mingw32编译

    附件中文件解压后可直接使用,win7 ,gcc 4.9.2以上编译。 编译过程中libcurl, zlib未作修改 openssl更改了test下几个文件,使用tdm-gcc 5.1.0编译 libssh2在github上下的源码,更改openssl.h文件,使用cmake编译 ...

    zlib源代码以及编译好的win32动态库静态库

    zlib源代码以及编译好的win32动态库静态库,支持win32工程。直接使用。

Global site tag (gtag.js) - Google Analytics