0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言动态库与静态库

zzw_111_bit 来源:zzw_111_bit 作者:zzw_111_bit 2023-02-06 09:45 次阅读

一、动态编译与静态编译

动态编译使用的是动态库文件进行编译,默认使用的是动态编译方法。

gcc hello.c -o hello

静态编译使用的是静态库文件进行的编译

gcc -static hello.c -o hello

静态编译要把静态库文件打包编译到可执行程序中,动态编译不会把动态库文件打包编译到可执行程序中,它们只是编译链接关系。

二、制作静态库

首先看一个例子,有一下三个c语言文件,mylib.c、mylib.h、mytest.c。mylib.h做函数的声明,mylib.c做函数的定义,mytest.c做功能的测试。

mylib.c

int max(int x,int y)
{
        return x>y?x:y;
}
int min(int x,int y)
{
        return x

mylib.h

#ifndef __MYLIB_H__
#define __MYLIB_H__
extern int max(int x,int y);
extern int min(int x,int y);
#endif

mytest.c

#include
#include "mylib.h"

int main(int argc,char *argv[])
{
        int a=10,b=20,max_num,min_num;
        max_num=max(a,b);
        min_num=min(a,b);
        printf("max_num=%d\\n",max_num);
        printf("min_num=%d\\n",min_num);
        return 0;
}

下面我们想让mylib.c打包为一个库文件。过程如下,首先我们让想打包的文件生成.o文件

gcc -c mylib.c -o mylib.o

然后将这个.o文件做成一个静态库,注意:静态库起名的时候必须以lib开头以.a结尾。

ar rc libmylib.a mylib.o

制作好静态库之后,我们可以编译程序了,这时候就可以不使用mylib.c文件了。编译程序有三种方法如下:

方法一

这几个文件都在同一个目录下面,就可以不用这么麻烦,直接使用下面的命令就可以完成编译。

gcc -static mytest.c libmylib.a -o mytest

方法二

可以指定头文件及库文件路径,比如我们可以将libmylib.a和mylib.h移动到/home/test文件夹下,那么可以使用的命令如下:

gcc -static mytest.c -o mytest -L/home/test -lmylib -I/home/test

下面对其中的参数做一些解释:

  • -L是指定库文件的路径
  • -l是指定找哪个库,指定的只要库文件lib后面.a前面的部分
  • -I是指定头文件的路径

方法三

可以将库文件和头文件存放到系统默认指定的路径下。库文件默认路径是/lib或者是/usr/lib。头文件默认路径是/usr/include。所以可以执行下面两条命令。

sudo mv libmylib.a /usr/lib
sudo mv mylib.h /usr/include

然后就可以执行编译程序命令。

gcc -static mytest.c -o mytest -lmylib

-l是指定的要找哪个库。

三、制作动态库

还是上面代码的例子,生成一个mylib.c的动态库文件。

1、首先是将要加入动态库的源文件编译为与位置无关的目标文件。

gcc -fPIC -c mylib.c

这时候就会生成一个与位置无关的目标文件,关于为什么会加上-fPIC的选项,可以参考这个博客。

2、然后第二步是将第一步生成的目标文件打包到动态库文件 。

gcc -shared -o libmylib.so mylib.o

3、然后是动态库链接生成可执行文件

gcc mytest.c libmylib.so -o mytest

但是这时候执行./mytest会报错,错误代码如下:

error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory

因为系统找不到自定义的库文件在那,可以有两种方法解决这个问题。

方法一

库文件、头文件均在当前目录下,通过添加环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

由于所有的库文件都在当前目录下,所有将当前路径添加到环境变量中。然后在使用命令进行编译:

gcc mytest.c libmylib.so -o mytest

这时候程序可以正常运行。

方法二

库函数、头文件假设均在/home文件夹下面,这个时候还需要添加环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

然后通过以下命令进行编译:

gcc mytest.c -o mytest -L/home -lmylib -I/home

然后执行可以通过。

方法三

将指定库函数和头文件均在系统路径下:

sudo cp libmylib.so /usr/lib
sudo cp mylib.h /usr/include

然后进行编译

gcc mytest.c -o mytest -lmylib

这个时候会显示编译通过,不需要添加环境变量。
审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7534

    浏览量

    128950
  • 静态库
    +关注

    关注

    0

    文章

    21

    浏览量

    7387
  • 编译
    +关注

    关注

    0

    文章

    616

    浏览量

    32399
  • 动态库
    +关注

    关注

    0

    文章

    16

    浏览量

    6194
收藏 人收藏

    评论

    相关推荐

    Linux系统动态静态库函数的使用介绍

    LD_LIBRARY_PATH告诉动态链接的地址,如图所示通过本文的叙述和练习相信大家应该对Linux的库函数机制有了些许了解,最主要的是学会怎么去开发使用文件。更多C
    发表于 04-02 16:21

    动态静态的区别

    目录下则执行方式为执行 gcc main.c -L 静态路径 -l 名。或者执行gcc main.c 路径/整个
    发表于 05-26 17:22

    Linux系统动态静态库函数的使用介绍

    LD_LIBRARY_PATH告诉动态链接的地址,如图所示 通过本文的叙述和练习相信大家应该对Linux的库函数机制有了些许了解,最主要的是学会怎么去开发使用文件。更多C
    发表于 09-29 11:31

    Linux下动态静态的制作及使用

    可执行代码的二进制格式,可以被载入内存中执行。根据链接时期的不同,又有:静态和共享(动态
    发表于 11-18 17:05

    关于labview'的动态链接的问题

    最近使用labview调用动态链接,使用vs2017生成dll文件,然后调用,但是为什么输入数组的情况下输出一直为0呢,我使用公式节点调用同样的c语言,就没问题?请教大佬们怎么解决?
    发表于 03-14 11:26

    静态与开发包的使用

    我打算在自己开发的c6678平台创建静态(static library),想咨询下,如果创建静态过程使用TI提供的开发包,如edma3_
    发表于 06-21 09:43

    Linux系统动态静态库函数的使用介绍

    动态,不特别指定的话,将与动态相连接。 1、静态链接我们先制作自己的
    发表于 07-04 05:33

    iOS静态动态的区别

    iOS 静态静态依赖、三方依赖、资源处理等)
    发表于 06-17 07:03

    Linux下静态动态的制作与使用

    什么是静态函数库动态函数库又是什么?linux静态函数库是怎样创建并使用的?动态函数库是怎样创建并使用的?
    发表于 04-26 06:45

    如何制作一个Linux下的动态

    以下主要介绍Linux 下动态静态、如何使用已有的动态, 以及如何制作一个
    发表于 11-04 06:58

    静态&动态的相关资料下载

    静态静态,所有的包含在最终可执行文件中,占用空间大,运行速度快.静态
    发表于 12-15 08:52

    静态动态的相关知识

    静态动态笔记系列嵌入式系统方向学习笔记1嵌入式系统方向学习笔记2文章目录静态
    发表于 12-22 07:49

    静态的优点及其静态的使用解析

    一、静态优点:运行快,发布程序无需提供静态,因为已经在app中,移植方便缺点:更新慢 繁琐1、静态
    发表于 02-17 07:45

    静态动态的使用

    就比较小。以 lib 开头,以.so 结尾。静态的制作步骤:编写或准备的源代码将源码.c 文件编译生成.o 文件使用 ar 命令创建静态
    发表于 05-04 14:08

    如何利用C语言去调用rust静态

    语言的感觉,要做不少的对接工作。也用过Lua,感觉也差不多。评估学习评估Rust语言时,感觉性能和体积应该都不会有太大的问题。加上语言本身主打的安全性,再结合一些,用来做一些
    发表于 06-21 10:27