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

    文章

    7618

    浏览量

    138659
  • 静态库
    +关注

    关注

    0

    文章

    21

    浏览量

    7503
  • 编译
    +关注

    关注

    0

    文章

    666

    浏览量

    33213
  • 动态库
    +关注

    关注

    0

    文章

    17

    浏览量

    6291
收藏 人收藏

    评论

    相关推荐

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

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

    动态静态的区别

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

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

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

    静态动态的相关知识

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

    静态动态的使用

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

    Linux下静态动态(共享)的制作与使用

    Linux下静态动态(共享)的制作与使用Linux
    发表于 07-09 14:39 1209次阅读

    linux静态动态分析

    的二进制是不兼容的。 本文仅限于介绍linux下的。 2.的种类 linux下的有两种:静态和共享
    发表于 11-02 10:12 1次下载

    你知道linux 静态和共享

    静态链接动态链接的区别在于,主程序在运行前,静态链接的链接固定写入在程序中,而
    发表于 04-26 16:46 2951次阅读

    Linux下的静态动态动态加载

    的存在极大的提高了C/C++程序的复用性,但是对于初学者来说有些难以驾驭,本文从Linux的角度浅谈Linux下的静态
    发表于 04-02 14:32 861次阅读

    讲解Linux虚拟机之使用动态静态

    了解 Linux 如何使用,包括静态动态的差别,有助于你解决依赖问题。
    发表于 05-06 17:05 2315次阅读
    讲解Linux虚拟机之使用<b class='flag-5'>动态</b><b class='flag-5'>库</b>和<b class='flag-5'>静态</b><b class='flag-5'>库</b>

    嵌入式Linux下动态静态使用

    以下主要介绍Linux 下动态静态、如何使用已有的动态, 以及如何制作一个
    发表于 11-01 16:57 1次下载
    嵌入式Linux下<b class='flag-5'>动态</b><b class='flag-5'>库</b>和<b class='flag-5'>静态</b><b class='flag-5'>库</b>使用

    C语言宏定义与预处理、函数和函数

    目录前言一、C语言预处理二、宏定义三、函数四、函数五、自己制作静态链接(ubuntu 环境下,即使用Linux系统平台上的gcc)六、自
    发表于 12-07 21:06 3次下载
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>宏定义与预处理、函数和函数<b class='flag-5'>库</b>

    静态动态的生成以及使用(树莓派)

    一、静态优点: 运行快,发布程序无需提供静态,因为已经在app中,移植方便缺点:更新慢 繁琐1、静态
    发表于 12-22 18:44 0次下载
    <b class='flag-5'>静态</b><b class='flag-5'>库</b>和<b class='flag-5'>动态</b><b class='flag-5'>库</b>的生成以及使用(树莓派)

    Linux开发_动态静态创建与Makefile规则

    介绍Linux下静态动态创建方式、完成静态动态
    的头像 发表于 09-17 15:41 1463次阅读

    动态静态的制作步骤

    是一种可执行的二进制文件,是编译好的代码。使用可以提高开发效率。在 Linux 下有静态动态
    的头像 发表于 07-27 11:00 911次阅读