色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

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

zzw_111_bit ? 來(lái)源: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)庫(kù)文件進(jìn)行編譯,默認(rèn)使用的是動(dòng)態(tài)編譯方法。

gcc hello.c -o hello

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

gcc -static hello.c -o hello

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

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

首先看一個(gè)例子,有一下三個(gè)c語(yǔ)言文件,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è)庫(kù)文件。過(guò)程如下,首先我們讓想打包的文件生成.o文件

gcc -c mylib.c -o mylib.o

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

ar rc libmylib.a mylib.o

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

方法一

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

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

方法二

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

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

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

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

方法三

可以將庫(kù)文件和頭文件存放到系統(tǒng)默認(rèn)指定的路徑下。庫(kù)文件默認(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è)庫(kù)。

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

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

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

gcc -fPIC -c mylib.c

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

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

gcc -shared -o libmylib.so mylib.o

3、然后是動(dòng)態(tài)庫(kù)鏈接生成可執(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)找不到自定義的庫(kù)文件在那,可以有兩種方法解決這個(gè)問(wèn)題。

方法一

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

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

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

gcc mytest.c libmylib.so -o mytest

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

方法二

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

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./

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

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

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

方法三

將指定庫(kù)函數(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ì)顯示編譯通過(guò),不需要添加環(huán)境變量。
審核編輯:湯梓紅

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

    關(guān)注

    180

    文章

    7614

    瀏覽量

    137438
  • 靜態(tài)庫(kù)
    +關(guān)注

    關(guān)注

    0

    文章

    21

    瀏覽量

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

    關(guān)注

    0

    文章

    661

    瀏覽量

    32978
  • 動(dòng)態(tài)庫(kù)

    關(guān)注

    0

    文章

    17

    瀏覽量

    6261
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    你知道linux 靜態(tài)庫(kù)和共享庫(kù)

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

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

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

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

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

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

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

    C語(yǔ)言宏定義與預(yù)處理、函數(shù)和函數(shù)庫(kù)

    目錄前言一、C語(yǔ)言預(yù)處理二、宏定義三、函數(shù)四、函數(shù)庫(kù)五、自己制作靜態(tài)鏈接庫(kù)(ubuntu 環(huán)境下,即使用Linux系統(tǒng)平臺(tái)上的gcc)六、自
    發(fā)表于 12-07 21:06 ?2次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>宏定義與預(yù)處理、函數(shù)和函數(shù)<b class='flag-5'>庫(kù)</b>

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

    一、靜態(tài)庫(kù)優(yōu)點(diǎn): 運(yùn)行快,發(fā)布程序無(wú)需提供靜態(tài)庫(kù),因?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'>庫(kù)</b>和<b class='flag-5'>動(dòng)態(tài)</b><b class='flag-5'>庫(kù)</b>的生成以及使用(樹(shù)莓派)

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

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

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

    庫(kù)是一種可執(zhí)行的二進(jìn)制文件,是編譯好的代碼。使用庫(kù)可以提高開(kāi)發(fā)效率。在 Linux 下有靜態(tài)庫(kù)動(dòng)態(tài)庫(kù)
    的頭像 發(fā)表于 07-27 11:00 ?844次閱讀
    主站蜘蛛池模板: 纯肉腐文高H总受男男 | 国产午夜人成在线视频麻豆 | 扒开胸罩揉她的乳尖视频 | 68日本xxxxxxxx79| 国产午夜AV无码无片久久96 | 亚洲激情一区 | jealousvue成熟40岁| 久久er国产免费精品 | 亚洲欧美日韩国产精品26u | 国产AV综合手机在线观看 | 小处雏一区二区三区 | tube日本护士 | 国产成人精品一区二区三区视频 | 午夜不卡久久精品无码免费 | AV天堂午夜精品蜜臀AV | 99久久国内精品成人免费 | 丰满饥渴老太性hd | 久久精品美女久久 | 在线国产a不卡 | 色狼亚洲色图 | 国产成人a在一区线观看高清 | 麻豆一区二区免费播放网站 | 国产一区二区在线观看免费 | 国产成人精品免费视频大全可播放的 | 91麻豆国产精品91久久久 | 青青草在线 视频 | 欧美肥胖女人bbwbbw视频 | 久久精品av| 暖暖视频免费高清在线观看 视频 | 国产亚洲精品第一区香蕉 | 日韩欧美一区二区中文字幕 | 亚洲精品第一页中文字幕 | 亚洲乱码在线卡一卡二卡新区 | 国产精品一区二区在线播放 | 99麻豆精品国产人妻无码 | 亚洲免费综合色视频 | 三级在线观看网站 | 美女18黄| 夜色资源站国产www在线视频 | 含羞草免费完整视频在线观看 | 99久久99久久久精品久久 |