1. 程式人生 > >linux下動態庫和靜態庫的製作、尋找、比較及相關Makefile的編寫

linux下動態庫和靜態庫的製作、尋找、比較及相關Makefile的編寫

一.庫的定義

什麼是庫,在windows平臺和linux平臺下都大量存在著庫。

本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。

由於windowslinux的本質不同,因此二者庫的二進位制是不相容的。

本文僅限於介紹linux下的庫。

二.庫的種類

1. 在windows

.dll 動態庫

.lib 靜態庫

庫即為原始碼的二進位制檔案

2. 在linux

.so 動態庫

.a      靜態庫

二者的不同點在於程式碼被載入的時刻不同。

靜態庫的程式碼在編譯過程中已經被載入可執行程式,因此體積較大。

共享庫的程式碼是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此程式碼體積較小。

三.庫存在的意義

庫是別人寫好的現有的,成熟的,可以複用的程式碼,你可以使用但要記得遵守許可協議。

現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的程式碼都從零開始,因此庫的存在意義非同尋常。共享庫的好處是,不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有一份該共享庫的例項。

四.庫檔案是如何產生的在linux

靜態庫的字尾是.a,它的產生分兩步:

Step 1.由原始檔編譯生成一堆.o,每個.o裡都包含這個編譯單元的符號表

Step 2.ar命令將很多.o轉換成.a,成文靜態庫

動態庫的字尾是.so,它由gcc加特定引數編譯產生。

例如:

$ gcc -fPIC -c *.c $ gcc -shared -Wl,-soname, libfoo.so.1 -olibfoo.so.1.0 *.

五.庫檔案是如何命名的,有沒有什麼規範

linux下,庫檔案一般放在/usr/lib/lib下,

靜態庫的名字一般為libxxxx.a,其中xxxx是該lib的名稱

動態庫的名字一般為libxxxx.so.major.minorxxxx是該lib的名稱,major是主版本號,minor是副版本號

六.程式在不同環境下執行時怎麼尋找庫

1. Linux系統預設到哪裡找命令,如果命令不在那裡,該怎麼設定?

(1) Linux在執行一條命令時,預設會到 /bin , /sbin ,, /usr/bin, /usr/sbin目錄下去找;如果找不到則報command not found
(2)如果命令存放在其他路徑下,我們可以通過export PATH匯出,不過這樣只是臨時生效;
(3) 如果想讓所有使用者生效,則修改/etc/profile,裡面通過export PATH匯出路徑;
(4) 在PC上如果只想對本使用者生效,則修改~/.bash_profile


2. LInux程式在執行時到哪裡找動態庫, 如果動態庫不在那裡,該怎麼設定?

(1)若是在開發板程式執行時:修改/etc/profile,export LD_LIBRARY_PATH新增庫的其他存放路徑。

(2)若是在片PC上程式執行時:動態庫預設路徑為/usr/lib和/lib,可在/etc/ld.so.conf中新增指定動態庫搜尋路徑,通過LD_LIBRARY_PATH(LD_LIBRARY_PATHLinux環境變數名,該環境變數主要用於指定查詢共享庫(動態連結庫)時除了預設路徑之外的其他路徑)命令指定,假如現在需要在已有的環境變數上新增新的路徑名,則採用如下方式:

LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路徑串)。

注:在linux下可以用export命令來設定這個值,比如

linux終端下輸入:export LD_LIBRARY_PATH=/opt/au1200_rm/build_tools/bin: $LD_LIBRARY_PATH:

然後再輸入:export

即會顯示是否設定正確

export方式在重啟後失效,所以也可以用 vim /etc/bashrc ,修改其中的LD_LIBRARY_PATH變數。

例如:LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/au1200_rm/build_tools/bin

3.編譯的時候:

編譯器編譯的時候,預設到哪裡找標頭檔案,如果不在怎麼指定編譯器到哪裡找標頭檔案;

連結器在做連線的時候,預設到哪裡找動態庫,如果不在怎麼指定連結器到哪裡找庫檔案;

連結器如果找不到某個函式或變數的定義,該怎麼指定連結器要連結哪個庫檔案;

如果是交叉編譯器的話,就不是在/usr/include下找了,而是在交叉編譯器路徑下找,同樣,交叉編譯的動態庫也是預設到交叉編譯器的路徑下去找,如果標頭檔案存放在其他路徑,通過-I 指定,動態庫存放在其他路徑,則通過-L指定路口,-l指定庫的名字。

七.如何知道一個可執行程式依賴哪些庫

ldd命令可以檢視一個可執行程式依賴的共享庫

例如:

[[email protected] lib]$ ldd libxtables.so.4

linux-gate.so.1 =>  (0x007cd000)

libdl.so.2 => /lib/libdl.so.2 (0x00de3000)

libc.so.6 => /lib/libc.so.6 (0x00c00000)

/lib/ld-linux.so.2 (0x00bde000)

八.可執行程式在執行的時候如何定位共享庫檔案

當系統載入可執行程式碼時候,能夠知道其所依賴的庫的名字,但是還需要知道絕對路徑

此時就需要系統動態載入器(dynamiclinker/loader),對於elf格式的可執行程式,是由ld-linux.so*來完成的。

它先後搜尋elf檔案的DT_RPATH段—環境變數LD_LIBRARY_PATH—/etc/ld.so.cache檔案列表—/lib/,/usr/lib目錄找到庫檔案後將其載入記憶體。

九.庫的建立

1.靜態庫

(1)定義:

這類庫的名字一般是libname.a.利用靜態庫編寫的檔案比較大,原因是整個函式庫中的資料都被整合進目的碼檔案中去。它的優點是,編譯後的執行程式不需要外部的函式庫支援,因為所有使用的函式都已經被編譯進可執行檔案了。同樣它的不足,如果靜態函式庫改變了,那麼你的程式必須重新編譯,而且體積也較大。

2)靜態庫的建立

linux環境中,使用ar命令建立靜態庫檔案.如下是命令的選項:

d -----從指定的靜態庫檔案中刪除檔案

m -----把檔案移動到指定的靜態庫檔案中

p -----把靜態庫檔案中指定的檔案輸出到標準輸出

q -----快速地把檔案追加到靜態庫檔案中

r -----把檔案插入到靜態庫檔案中

t -----顯示靜態庫檔案中檔案的列表

x -----從靜態庫檔案中提取檔案

還有多個修飾符修改以上基本選項,詳細請man ar以下列出三個:

a -----把新的目標檔案(*.o)新增到靜態庫檔案中現有檔案之後

b-----***************************************之前

v -----使用詳細模式

ar 命令的命令列格式如下:

gcc -c filen.c

ar -cr libname.a file1.o file2.o

(3)建立庫檔案之後,可以建立這個靜態庫檔案的索引來幫助提高和庫連線的其他程式的編譯速度:

使用ranlib程式建立庫的索引,索引存放在庫檔案內部.

ranlib libapue.a

nm程式顯示存檔檔案的索引,它可以顯示目標檔案的符號

nm libapue.a | more

如果是顯示目標檔案的符號:

nm error.o | more

如何使用呢?如下所示:

gcc -o test test.c libapue.a

這樣就可以在test.c中呼叫在libapue.a中的函數了.

2.動態庫

(1)定義:

名字一般是libname.so.相對於靜態函式庫,動態函式庫在編譯的時候並沒有被編譯進目的碼中,你的程式執行到相關函式是菜呼叫函式庫裡的函式,因此動態函式庫所產生的可執行檔案比較小。由於函式庫沒有被整合進你的程式,而是程式執行時動態申請並呼叫,所以程式的執行環境中必須提供相應的庫。動態函式庫的改變並不影響你的程式,所以動態函式庫的升級比較方便。而且如果多個應用程式都要使用同一函式庫,動態庫就非常適合,可以減少應用程式的體積。

(2)動態庫的建立

gcc -shard -fpic -o libname.so test1.c test2.c ....

-fpic:產生程式碼位置無關程式碼

-shared 生成一個共享庫

(3)編譯共享庫

假設共享庫位於當前目錄(即跟程式檔案相同的目錄中)

gcc -o test -L. -lapue test.c

這樣就編譯出了不包含函式程式碼可執行檔案了

十.實際操作

1.編寫三個簡單函式ADD.c SUB.c MUL.c

[[email protected] ~]$ mkdir src

[[email protected] ~]$ mkdir app

[[email protected] ~]$ cd src/

(1)ADD.c函式的編寫

[[email protected] src]$ vim ADD.c

#include <stdio.h>
 int ADD(int a, int b)
{
        return a+b;
}

(2)SUB.c函式的編寫

[[email protected] src]$ vim SUB.c

 #include <stdio.h>
 int SUB(int a ,int b)
{
        return a-b;
}
(3)MUL.c函式的編寫

[[email protected] src]$ vim MUL.c

#include <stdio.h>
#include <stdio.h>
 int MUL(int a , int b)
{
        return a*b;
}
(4)標頭檔案fun.h的編寫

[[email protected] src]$ vim fun.h

#ifdef __FUN_H_
#define __FUN_H_
        extern ADD(int a , int b);
        extern SUB(int a , int b);
        extern MUL(int a , int b);
#endif
(5)main函式的編寫

[[email protected] ~]$ cd app/

[[email protected] app]$ vim main.c

#include <stdio.h>

#include <fun.h>
 int main (void)
{
     int a=5;
     int b=10;
     printf("a=5,b=10\n");
     printf("a+b=%d\n",ADD(a,b));
     printf("a-b=%d\n",SUB(a,b));
     printf("a*b=%d\n",MUL(a,b));
     return 0;
}
2.生成靜態庫

[[email protected] ~]$ cd src/

[[email protected] src]$ ls

ADD.C  fun.h  MUL.c  SUB.c

[l[[email protected] src]$ gcc -c *.c

[[email protected] src]$ ls

ADD.c  ADD.o  fun.h  MUL.c  MUL.o  SUB.c  SUB.o

[[email protected] src]$ ar -cr libfun.a *.o

[[email protected] src]$ ls

ADD.c  ADD.o  fun.h  libfun.a  MUL.c  MUL.o  SUB.c  SUB.o

此時生成的libfun.a即為一個靜態庫。

3.Makefile的編寫及瞭解

在生成動態庫前我們先了解一下Makefile 的編寫,畢竟生成動態庫還需依賴Makefile

(1)概述

Linux 環境下的程式設計師如果不會使用GNU make來構建和管理自己的工程,應該不能算是一個合格的專業程式設計師,至少不能稱得上是Unix程式設計師。在Linux(unix )環境下使用GNUmake工具能夠比較容易的構建一個屬於你自己的工程,整個工程的編譯只需要一個命令就可以完成編譯、連線以至於最後的執行。不過這需要投入一些時間去完成一個或者多個稱之為Makefile檔案的編寫。

所要完成的Makefile檔案描述了整個工程的編譯、連線等規則。其中包括:工程中的哪些原始檔需要編譯以及如何編譯、需要建立那些庫檔案以及如何建立這些庫檔案、如何最後產生想要得可執行檔案。儘管看起來可能是很複雜的事情,但是為工程編寫Makefile的好處是能夠使用一行命令來完成自動化編譯,一旦提供一個(通常對於一個工程來說會是多個)正確的Makefile。編譯整個工程你所要做的唯一的一件事就是在shell 提示符下輸入make命令。整個工程完全自動編譯,極大提高了效率。

make是一個命令工具,它解釋Makefile中的指令(應該說是規則)。在Makefile檔案中描述了整個工程所有檔案的編譯順序、編譯規則。Makefile有自己的書寫格式、關鍵字、函式。像C語言有自己的格式、關鍵字和函式一樣。而且在Makefile中可以使用系統shell所提供的任何命令來完成想要的工作。Makefile(在其它的系統上可能是另外的檔名)在絕大多數的IDE開發環境中都在使用,已經成為一種工程的編譯方法

(2)Makefile規範

Make  執行總目標

Make clean 執行Makefile 中的clean目標

Make -C directory 到directory中執行make

Make clean -C directory  同上兩命令

Make -f common_Makefile 通過-f 指定一個Makefile檔案

Make var=value   給Makefie傳一個引數其值為value

# 註釋

VAR=XXX    定義變數VAR,強制賦值

VAR+=XXX 追加

VAR?=XXX   之前定義,若使用之前沒有定義則應先定義

Target: depend1 depend2 . .          #依賴可以是檔案(目錄)或其他目標

(tab)  action1 action2            #動作那一行必須以TAB鍵打頭

Depend1:

@(tab)Action1 action2    #@j鍵表示不列印該行動作資訊

(3)根據機子的函式生成的*.0檔案和靜態庫編寫Makefile

[[email protected] src]$ vim Makefile

LIB_NAME?=fun
   
all:static_library shared_library
   
static_library:
        gcc -c *.c;
        ar  -cr lib${LIB_NAME}.a *.o;
  
shared_library:
        gcc -shared -fpic -o lib${LIB_NAME}.so *.c;
 
clean:
        rm -rf *.o
        rm -rf *.a *.so

再對main.c編寫Makefile

[[email protected] app]$ vim Makefile

APP_NAME?=APP
   
all:lib_make
        gcc -static -I../src main.c -L../src -lfun -o ${APP_NAME};
  
lib_make:
        make -C ../src;
  
clean:
        rm -rf ${APP_NAME}

4.生成動態庫

[[email protected] ~]$ cd src/

[[email protected] src]$ ls

ADD.c  ADD.o  fun.h  libfun.a  Makefile  MUL.c  MUL.o  SUB.c  SUB.o

[[email protected] src]$ gcc -shared -fpic -o libfun.so  *.c  

[[email protected] src]$ ls

ADD.c  ADD.o  fun.h  libfun.a  libfun.so  Makefile  MUL.c  MUL.o  SUB.c  SUB.o

這裡生成的libfun.so 即為一個動態庫

5.靜態庫與動態庫的使用

對main.c進行編譯

[[email protected] app]$ gcc -I../src main.c -L../src -lfun -o app

[[email protected] app]$ ls

app  main.c  Makefile

此時生成一個可執行檔案app

[[email protected] app]$ file app

app: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

這時我們可以發現 系統編譯時預設使用的是動態連結  執行時我們需要指定動態庫的位置

兩種方法:

(1)將函式庫移動到/lib 或者/usr/lib下 (需要root許可權)

[[email protected] ~]$ cd src/

[[email protected] src]$ ls

ADD.c  ADD.o  fun.h  libfun.a  libfun.so  Makefile  MUL.c  MUL.o  SUB.c  SUB.o

[[email protected] src]$ sudo cp libfun.so /lib/

[[email protected] ~]$ cd app

[[email protected] app]$ ./app

a=5,b=10

a+b=15

a-b=-5

a*b=50

(2)修改一個環境變數 LD_LIBRARY_PATH

[[email protected] app]$ ls

app  main.c  Makefile

[[email protected] app]$ export LD_LIBRARY_PATH='/home/leiyuxing/src'

[[email protected] app]$ ./app

a=5,b=10

a+b=15

a-b=-5

a*b=50

採用靜態連結方式  需要-static關鍵字

[[email protected] app]$ gcc -static -I../src main.c -o bpp -L../src -lfun

[[email protected] app]$ ls

 bpp  main.c  Makefile

[[email protected] app]$ ./bpp

a=5,b=10

a+b=15

a-b=-5

a*b=50

6.動態庫與靜態庫的比較

(1)使用du命令分別檢視兩個可執行檔案的大小

[[email protected] app]$ du app

8       app

[[email protected] app]$ du bpp

632     bpp

(2)看一個檔案執行依賴的動態庫

[[email protected] app]$ ldd app

        linux-gate.so.1 =>  (0x00ac5000)

        libfun.so => /home/leiyuxing/src/libfun.so (0x00c48000)

        libc.so.6 => /lib/libc.so.6 (0x001d0000)

        /lib/ld-linux.so.2 (0x00bde000)

[[email protected] app]$ ldd bpp

        不是動態可執行檔案

綜上所述:

 當程式與靜態庫連線時,庫中目標檔案所含的所有將被程式使用的函式的機器碼被copy到最終的可執行檔案中。這就會導致最終生成的可執行程式碼量相對變多,相當於編譯器將程式碼補充完整了,這樣執行起來相對就快些。不過會有個缺點佔用磁碟和記憶體空間. 靜態庫會被新增到和它連線的每個程式中而且這些程式執行時都會被載入到記憶體中無形中又多消耗了更多的記憶體空間.

       與共享庫連線的可執行檔案只包含它需要的函式的引用表,而不是所有的函式程式碼,只有在程式執行時, 那些需要的函式程式碼才被拷貝到記憶體中。這樣就使可執行檔案比較小節省磁碟空間,更進一步,作業系統使用虛擬記憶體,使得一份共享庫駐留在記憶體中被多個程式使用,也同時節約了記憶體。不過由於執行時要去連結庫會花費一定的時間,執行速度相對會慢一些,總的來說靜態庫是犧牲了空間效率,換取了時間效率,共享庫是犧牲了時間效率換取了空間效率,沒有好與壞的區別,只看具體需要了。

遇到的問題:

問題一:

[[email protected] app]$ gcc main.c

main.c:3:17: 錯誤:fun.h:沒有那個檔案或目錄

編譯器報錯 找不到標頭檔案  需要指定標頭檔案的位置 

解決方法:

-I選項 指定標頭檔案的路徑

[[email protected] app]$ gcc -I../src main.c

/tmp/ccUfqu2w.o: In function `main':

main.c:(.text+0x35): undefined reference to `ADD'

main.c:(.text+0x5a): undefined reference to `SUB'

main.c:(.text+0x7f): undefined reference to `MUL'

collect2: ld 返回 1

問題二:

[[email protected] app]$ gcc -I../src main.c

/tmp/ccUfqu2w.o: In function `main':

main.c:(.text+0x35): undefined reference to `ADD'

main.c:(.text+0x5a): undefined reference to `SUB'

main.c:(.text+0x7f): undefined reference to `MUL'

collect2: ld 返回 1

 連結器再一次報錯  未能找庫

解決方法:

-L選項來指定庫的路徑

-l選項來指定庫的名字 (去掉lib和.a .so)剩下的部分  即-lfun

[[email protected] app]$ gcc -I../src main.c -L../src -lfun -o app

[[email protected] app]$ ls

app  main.c  Makefile

問題三:

[[email protected] app]$ ./app

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

執行時出錯  找不到動態庫

解決方法:

方法一:將函式庫移動到/lib 或者/usr/lib下 (需要root許可權)

方法二:修改一個環境變數 LD_LIBRARY_PATH

相關推薦

LinuxMakefile製作動態靜態並編譯生成可執行程式

Makefile 一個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新

linux動態靜態製作尋找比較相關Makefile編寫

一.庫的定義 什麼是庫,在windows平臺和linux平臺下都大量存在著庫。 本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。 由於windows和linux的本質不同,

LinuxRabbitMQ的編譯,生成動態靜態

執行 編譯 ast lin 目錄 off href apt-get span 一、步驟 1、代碼托管處下載代碼 最新:https://github.com/alanxz/rabbitmq-c/archive/master.zip 穩定:https://g

Linux動態靜態的連結

一、檢視連結了哪些指令 ldd 程式名字 二、在應用程式需要連線外部庫的情況下,linux預設對庫的連線是使用動態庫,在找不到動態庫的情況下再選擇靜態庫。使用方式為: gcc test.cpp -L. -ltestlib 如果當前目錄有兩個庫libtestlib.

Linux怎麼建立動態靜態

前言 linux下的生成的動態庫和靜態庫沒有windows下方便 linux下gcc編譯預設動態連結和release 程式執行後呼叫動態庫 動態庫: 程式在執行的時候才去連結動態庫的程式碼,多個程式

linuxg++ 編譯時動態靜態的連結標頭檔案問題

原來編譯的時候都是用的很隨意,沒用系統的總結一下,這幾天在編譯的時候遇到一些下問題,於是就總結一下,省得過幾天又給忘了。 1.動態庫和靜態庫簡介 靜態庫在程式連結的時候會自動的連結到程式裡,所以一旦編譯完成,靜態庫就不需要了,靜態庫以.a結尾。  動態庫在編譯時不會被連線到目的碼中,而是在程式執行

Linux動態靜態

庫: 在c/c++裡,使用庫(library)的技術,可以將編譯好的符號提供給第三方使用。 1)共享庫(動態庫)share library 2)   靜態庫 static library 一:動態庫

linux c 語言程式設計環境:動態靜態製作

庫: 庫用於將相似函式打包在一個單元中。然後這些單元就可為其他開發人員所共享,並因此有了模組化程式設計這種說法 — 即,從模組中構建程式。Linux 支援兩種型別的庫,每一種庫都有各自的優缺點。靜態庫包

Linux 動態靜態

Linux作業系統中,依據函式庫是否被編譯到程式內部,將其分為兩大類,靜態函式庫和動態函式庫。 Linux下的函式庫放在/lib或/usr/lib,標頭檔案放在/usr/include。 在既有靜態庫又有動態庫的情況下,預設使用動態庫,如果強制使用靜態庫則需要加-static選項支援。

QtEmbedded-4.8.6-arm 編譯選擇從 動態變化到靜態 時,生成的Makefile連結路徑如果有動態靜態,優先選擇動態編譯應用

問題:QtEmbedded-4.8.6-arm 編譯選擇從 動態庫到靜態庫 時,發現的一個疑惑:,生成的Makefile連結庫路徑下如果有動態庫和靜態庫,優先選擇動態庫編譯應用 具體現象: 我最初是使用動態庫的 QtEmbedded-4.8.6-arm (編譯器選擇時,是 ./co

Linux中的動態靜態(.a.la.so.o)

​ Linux中的動態庫和靜態庫(.a/.la/.so/.o) 原文地址:https://www.cnblogs.com/findumars/p/5421910.html 在windows下,一般可以通過檔案的字尾名來識別檔案的型別。在Linux下大致上也是可以的。但是要明

Linux系統的動態靜態

靜態庫 靜態庫:一些公共程式碼是需要反覆使用,就把這些程式碼編譯為“庫”檔案;在連結步驟中,聯結器將從庫檔案取得所需的程式碼,複製到生成的可執行檔案中的這種庫。 程式編譯一般需經預處理、編譯、彙編和連結幾個步驟。靜態庫特點是可執行檔案中包含了庫程式碼的一份完整拷貝;缺點就是被多次

linux c/c++ 動態靜態的生成與使用

二.介紹     從原始碼到可執行程式,通常要經過最重要的兩大步是:編譯,連結。編譯就是將原始檔生成中間檔案的過程,在linux下就是生成  .obj檔案。連結就是用連結器將,這些個中間檔案有序地”糅合“在一起,構成一個可執行檔案。通常,一個.c檔案或者.cpp原始檔編譯後,就會對應生成一個.obj檔案。  

自己在linux上編譯連結動態靜態的學習筆記

在平常的專案中,我們都是使用公司要求的makefile、makedebug一類的檔案,因此,在編譯、連結、生成和連結動態庫與靜態庫的時候,我們只是簡單的使用一些已經設定的變數,只是簡單的修改、新增一些檔名,或許這次我們編譯通過了,但是,在某一個時候,可能出現了一個問題,無論

linux編譯自己的靜態時依賴其他的動態,使用時出現“undefined reference to”

        對於我這個剛入IT行業不就得新手來說,在linux下連結庫的時候總是會遇到各種各樣奇葩的問題,最多的就是“undefined reference to”和“cannot find”這兩類,層出不窮,總是在我即將完成工作的時候給我當頭一棒,讓我欲罷不能。這不,這

linux兩種:動態靜態(共享)說明

linux下有兩種庫:動態庫和靜態庫(共享庫) 二者的不同點在於程式碼被載入的時刻不同。 靜態庫的程式碼在編譯過程中已經被載入可執行程式,因此體積比較大。 動態庫(共享庫)的程式碼在可執行程式執行時才載入記憶體,在編譯過程中僅簡單的引用,因此程式碼體積比較

動態靜態

linu not fine 執行文件 port pic 靜態庫 可執行 生成可執行文件 前提:本文是基於Linux系統下的編程與學習 補充:頭文件衛士,避免頭文件重復包含。 //頭文件衛士 #ifndef __HEAD_H__ #define __HEAD_H__ //頭

iOS裡的動態靜態

介紹 動態庫形式:.dylib和.framework 靜態庫形式:.a和.framework 動態庫和靜態庫的區別 靜態庫:連結時,靜態庫會被完整地複製到可執行檔案中,被多次使用就有多份冗餘拷貝(圖1所示) 系統動態庫:連結時不復制,程式執行時由系統動態

gcc中動態靜態的連結順序

so檔案:動態庫 a檔案: 靜態庫 exe檔案:可執行程式(linux下以檔案屬性來標示是否是可執行檔案,與字尾名無關) gcc中連結順序問題,總結出以下幾點: 1,動態庫中可以包含另一個靜態庫,通過引數 -lxxx 把靜態庫libxxx.a加入so檔案中,這樣so檔案中 &nbs

編譯時混合使用動態靜態

         編譯某個測試程式碼時,出現了下面的錯誤:# g++ -std=c++11 -o testlurkcli main.cpp -L. -llurkcli-lasl -static /us