那曲檬骨新材料有限公司

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

    文章

    7614

    瀏覽量

    137732
  • 靜態庫
    +關注

    關注

    0

    文章

    21

    瀏覽量

    7487
  • 編譯
    +關注

    關注

    0

    文章

    661

    瀏覽量

    33046
  • 動態庫
    +關注

    關注

    0

    文章

    17

    瀏覽量

    6270
收藏 人收藏

    評論

    相關推薦

    Linux系統動態靜態庫函數的使用介紹

    LD_LIBRARY_PATH告訴動態鏈接的地址,如圖所示通過本文的敘述和練習相信大家應該對Linux的庫函數機制有了些許了解,最主要的是學會怎么去開發使用文件。更多C
    發表于 04-02 16:21

    動態靜態的區別

    目錄下則執行方式為執行 gcc main.c -L 靜態路徑 -l 名?;蛘邎绦術cc 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

    什么是DLL (動態連接)

    什么是DLL (動態連接) DLL(動態連接),既然是動態,那么就是有靜態連接
    發表于 11-28 14:51 ?1.5w次閱讀

    Linux下靜態動態(共享)的制作與使用

    Linux下靜態動態(共享)的制作與使用Linux
    發表于 07-09 14:39 ?1194次閱讀

    linux靜態動態分析

    的二進制是不兼容的。 本文僅限于介紹linux下的。 2.的種類 linux下的有兩種:靜態和共享
    發表于 11-02 10:12 ?1次下載

    你知道linux 靜態和共享?

    靜態鏈接動態鏈接的區別在于,主程序在運行前,靜態鏈接的鏈接固定寫入在程序中,而
    發表于 04-26 16:46 ?2925次閱讀

    Linux下的靜態、動態動態加載

    的存在極大的提高了C/C++程序的復用性,但是對于初學者來說有些難以駕馭,本文從Linux的角度淺談Linux下的靜態
    發表于 04-02 14:32 ?839次閱讀

    講解Linux虛擬機之使用動態靜態

    了解 Linux 如何使用,包括靜態動態的差別,有助于你解決依賴問題。
    發表于 05-06 17:05 ?2243次閱讀
    講解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>使用

    靜態動態的生成以及使用(樹莓派)

    一、靜態優點: 運行快,發布程序無需提供靜態,因為已經在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 ?1388次閱讀

    動態靜態的制作步驟

    是一種可執行的二進制文件,是編譯好的代碼。使用可以提高開發效率。在 Linux 下有靜態動態
    的頭像 發表于 07-27 11:00 ?859次閱讀
    百家乐分享| 怀远县| 百家乐官网娱乐网网| 大发888缺casino组件| 百家乐官网平台送彩金| 百家乐网哪一家做的最好呀| 百家乐官网投注五揽式| 三亚百家乐的玩法技巧和规则| 百家乐官网的寻龙定穴| 百家乐赌场软件| 百家乐官网游戏算牌| 金百家乐网站| 百家乐官网长龙有几个| 龍城百家乐的玩法技巧和规则| 澳门百家乐官网大家乐眼| 百家乐真人赌场娱乐网规则| 百家乐官网视频麻将下载| 太阳百家乐代理| 百家乐官网破解赌戏玩| 猪猪棋牌游戏| 百家乐作弊视频| 百家乐官网公式分析| 百家乐下| 红宝石百家乐官网娱乐城| 大发888真钱游戏下载| 24山的丑方位| 淮滨县| tt百家乐的玩法技巧和规则| 网上百家乐官网骗钱| 足球现金网| 鑫鼎百家乐娱乐城| 百家乐官网透视牌靴哪里有| 手机棋牌游戏平台| 鲨鱼百家乐游戏平台| 网上百家乐官网有人赢过嘛 | 香港六合彩彩图| 七胜百家乐娱乐城总统网上娱乐城大都会娱乐城赌场 | 包头市| 集结号棋牌下载| 鸟巢百家乐的玩法技巧和规则| 百家乐游戏软件开发|