RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言動(dòng)態(tài)庫與靜態(tài)庫

zzw_111_bit ? 來源:zzw_111_bit ? 作者:zzw_111_bit ? 2023-02-06 09:45 ? 次閱讀

一、動(dòng)態(tài)編譯與靜態(tài)編譯

動(dòng)態(tài)編譯使用的是動(dòng)態(tài)庫文件進(jìn)行編譯,默認(rèn)使用的是動(dòng)態(tài)編譯方法。

gcc hello.c -o hello

靜態(tài)編譯使用的是靜態(tài)庫文件進(jìn)行的編譯

gcc -static hello.c -o hello

靜態(tài)編譯要把靜態(tài)庫文件打包編譯到可執(zhí)行程序中,動(dòng)態(tài)編譯不會(huì)把動(dòng)態(tài)庫文件打包編譯到可執(zhí)行程序中,它們只是編譯鏈接關(guān)系。

二、制作靜態(tài)庫

首先看一個(gè)例子,有一下三個(gè)c語言文件,mylib.c、mylib.h、mytest.c。mylib.h做函數(shù)的聲明,mylib.c做函數(shù)的定義,mytest.c做功能的測(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打包為一個(gè)庫文件。過程如下,首先我們讓想打包的文件生成.o文件

gcc -c mylib.c -o mylib.o

然后將這個(gè).o文件做成一個(gè)靜態(tài)庫,注意:靜態(tài)庫起名的時(shí)候必須以lib開頭以.a結(jié)尾。

ar rc libmylib.a mylib.o

制作好靜態(tài)庫之后,我們可以編譯程序了,這時(shí)候就可以不使用mylib.c文件了。編譯程序有三種方法如下:

方法一

這幾個(gè)文件都在同一個(gè)目錄下面,就可以不用這么麻煩,直接使用下面的命令就可以完成編譯。

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

方法二

可以指定頭文件及庫文件路徑,比如我們可以將libmylib.a和mylib.h移動(dòng)到/home/test文件夾下,那么可以使用的命令如下:

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

下面對(duì)其中的參數(shù)做一些解釋:

  • -L是指定庫文件的路徑
  • -l是指定找哪個(gè)庫,指定的只要庫文件lib后面.a前面的部分
  • -I是指定頭文件的路徑

方法三

可以將庫文件和頭文件存放到系統(tǒng)默認(rèn)指定的路徑下。庫文件默認(rèn)路徑是/lib或者是/usr/lib。頭文件默認(rèn)路徑是/usr/include。所以可以執(zhí)行下面兩條命令。

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

然后就可以執(zhí)行編譯程序命令。

gcc -static mytest.c -o mytest -lmylib

-l是指定的要找哪個(gè)庫。

三、制作動(dòng)態(tài)庫

還是上面代碼的例子,生成一個(gè)mylib.c的動(dòng)態(tài)庫文件。

1、首先是將要加入動(dòng)態(tài)庫的源文件編譯為與位置無關(guān)的目標(biāo)文件。

gcc -fPIC -c mylib.c

這時(shí)候就會(huì)生成一個(gè)與位置無關(guān)的目標(biāo)文件,關(guān)于為什么會(huì)加上-fPIC的選項(xiàng),可以參考這個(gè)博客。

2、然后第二步是將第一步生成的目標(biāo)文件打包到動(dòng)態(tài)庫文件 。

gcc -shared -o libmylib.so mylib.o

3、然后是動(dòng)態(tài)庫鏈接生成可執(zhí)行文件

gcc mytest.c libmylib.so -o mytest

但是這時(shí)候執(zhí)行./mytest會(huì)報(bào)錯(cuò),錯(cuò)誤代碼如下:

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

因?yàn)橄到y(tǒng)找不到自定義的庫文件在那,可以有兩種方法解決這個(gè)問題。

方法一

庫文件、頭文件均在當(dāng)前目錄下,通過添加環(huán)境變量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

由于所有的庫文件都在當(dāng)前目錄下,所有將當(dāng)前路徑添加到環(huán)境變量中。然后在使用命令進(jìn)行編譯:

gcc mytest.c libmylib.so -o mytest

這時(shí)候程序可以正常運(yùn)行。

方法二

庫函數(shù)、頭文件假設(shè)均在/home文件夾下面,這個(gè)時(shí)候還需要添加環(huán)境變量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

然后通過以下命令進(jìn)行編譯:

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

然后執(zhí)行可以通過。

方法三

將指定庫函數(shù)和頭文件均在系統(tǒng)路徑下:

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

然后進(jìn)行編譯

gcc mytest.c -o mytest -lmylib

這個(gè)時(shí)候會(huì)顯示編譯通過,不需要添加環(huán)境變量。
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136683
  • 靜態(tài)庫
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

    7426
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    657

    瀏覽量

    32852
  • 動(dòng)態(tài)庫
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    6222
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Linux系統(tǒng)動(dòng)態(tài)靜態(tài)庫函數(shù)的使用介紹

    LD_LIBRARY_PATH告訴動(dòng)態(tài)鏈接的地址,如圖所示通過本文的敘述和練習(xí)相信大家應(yīng)該對(duì)Linux的庫函數(shù)機(jī)制有了些許了解,最主要的是學(xué)會(huì)怎么去開發(fā)使用文件。更多C
    發(fā)表于 04-02 16:21

    動(dòng)態(tài)靜態(tài)的區(qū)別

    目錄下則執(zhí)行方式為執(zhí)行 gcc main.c -L 靜態(tài)路徑 -l 名?;蛘邎?zhí)行g(shù)cc main.c 路徑/整個(gè)
    發(fā)表于 05-26 17:22

    Linux下靜態(tài)動(dòng)態(tài)的制作與使用

    什么是靜態(tài)函數(shù)庫?動(dòng)態(tài)函數(shù)庫又是什么?linux靜態(tài)函數(shù)庫是怎樣創(chuàng)建并使用的?動(dòng)態(tài)函數(shù)庫是怎樣創(chuàng)建并使用的?
    發(fā)表于 04-26 06:45

    靜態(tài)動(dòng)態(tài)的相關(guān)知識(shí)

    靜態(tài)動(dòng)態(tài)筆記系列嵌入式系統(tǒng)方向?qū)W習(xí)筆記1嵌入式系統(tǒng)方向?qū)W習(xí)筆記2文章目錄靜態(tài)
    發(fā)表于 12-22 07:49

    靜態(tài)動(dòng)態(tài)的使用

    就比較小。以 lib 開頭,以.so 結(jié)尾。靜態(tài)的制作步驟:編寫或準(zhǔn)備的源代碼將源碼.c 文件編譯生成.o 文件使用 ar 命令創(chuàng)建靜態(tài)
    發(fā)表于 05-04 14:08

    什么是DLL (動(dòng)態(tài)連接)

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

    Linux下靜態(tài)動(dòng)態(tài)(共享)的制作與使用

    Linux下靜態(tài)動(dòng)態(tài)(共享)的制作與使用Linux
    發(fā)表于 07-09 14:39 ?1169次閱讀

    linux靜態(tài)動(dòng)態(tài)分析

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

    你知道linux 靜態(tài)和共享?

    靜態(tài)鏈接動(dòng)態(tài)鏈接的區(qū)別在于,主程序在運(yùn)行前,靜態(tài)鏈接的鏈接固定寫入在程序中,而
    發(fā)表于 04-26 16:46 ?2897次閱讀

    Linux下的靜態(tài)、動(dòng)態(tài)動(dòng)態(tài)加載

    的存在極大的提高了C/C++程序的復(fù)用性,但是對(duì)于初學(xué)者來說有些難以駕馭,本文從Linux的角度淺談Linux下的靜態(tài)
    發(fā)表于 04-02 14:32 ?797次閱讀

    講解Linux虛擬機(jī)之使用動(dòng)態(tài)靜態(tài)

    了解 Linux 如何使用,包括靜態(tài)動(dòng)態(tài)的差別,有助于你解決依賴問題。
    發(fā)表于 05-06 17:05 ?2183次閱讀
    講解Linux虛擬機(jī)之使用<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>庫</b>和<b class='flag-5'>靜態(tài)</b><b class='flag-5'>庫</b>

    嵌入式Linux下動(dòng)態(tài)靜態(tài)使用

    以下主要介紹Linux 下動(dòng)態(tài)、靜態(tài)、如何使用已有的動(dòng)態(tài), 以及如何制作一個(gè)
    發(fā)表于 11-01 16:57 ?1次下載
    嵌入式Linux下<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>庫</b>和<b class='flag-5'>靜態(tài)</b><b class='flag-5'>庫</b>使用

    靜態(tài)動(dòng)態(tài)的生成以及使用(樹莓派)

    一、靜態(tài)優(yōu)點(diǎn): 運(yùn)行快,發(fā)布程序無需提供靜態(tài),因?yàn)橐呀?jīng)在app中,移植方便缺點(diǎn):更新慢 繁瑣1、靜態(tài)
    發(fā)表于 12-22 18:44 ?0次下載
    <b class='flag-5'>靜態(tài)</b><b class='flag-5'>庫</b>和<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>庫</b>的生成以及使用(樹莓派)

    Linux開發(fā)_動(dòng)態(tài)靜態(tài)創(chuàng)建與Makefile規(guī)則

    介紹Linux下靜態(tài)、動(dòng)態(tài)創(chuàng)建方式、完成靜態(tài)、動(dòng)態(tài)
    的頭像 發(fā)表于 09-17 15:41 ?1265次閱讀

    動(dòng)態(tài)靜態(tài)的制作步驟

    是一種可執(zhí)行的二進(jìn)制文件,是編譯好的代碼。使用可以提高開發(fā)效率。在 Linux 下有靜態(tài)動(dòng)態(tài)
    的頭像 發(fā)表于 07-27 11:00 ?804次閱讀
    RM新时代网站-首页