gcc編譯靜態庫和動態庫

2021-06-20 05:11:56 字數 2526 閱讀 5953

一、動態鏈結庫

1.建立hello.so動態庫

[cpp]view plain

copy

print?

#include 

voidhello()  

編譯:gcc -fpic -shared hello.c -o libhello.so  

#include void hello()

編譯:gcc -fpic -shared hello.c -o libhello.so

2.hello.h標頭檔案

[cpp]view plain

copy

print?

voidhello();  

void hello();

3.鏈結動態庫

[cpp]view plain

copy

print?

#include 

#include "hello.h"

intmain()  

編譯:gcc main.c -l. -lhello -o main  

#include #include "hello.h"

int main()

編譯:gcc main.c -l. -lhello -o main

這裡-l的選項是指定編譯器在搜尋動態庫時搜尋的路徑,告訴編譯器hello庫的位置。"."意思是當前路徑.

[plain]view plain

copy

print?

in function `main':  

main.c:(.text+0x1d): undefined reference to `hello'  

collect2: ld returned 1 exit status  

in function `main':

main.c:(.text+0x1d): undefined reference to `hello'

collect2: ld returned 1 exit status

這是因為在鏈結hello動態庫時,編譯器沒有找到。

解決方法:

[plain]view plain

copy

print?

sudo cp libhello.so /usr/lib/  

sudo cp libhello.so /usr/lib/
這樣,再次執行就成功輸入:

call hello()

二、靜態庫

檔案有:main.c、hello.c、hello.h

1.編譯靜態庫hello.o: 

[plain]view plain

copy

print?

gcc hello.c -o hello.o  #這裡沒有使用-shared  

gcc hello.c -o hello.o  #這裡沒有使用-shared

2.把目標文件歸檔

[plain]view plain

copy

print?

ar -r libhello.a hello.o  #這裡的ar相當於tar的作用,將多個目標打包。  

ar -r libhello.a hello.o  #這裡的ar相當於tar的作用,將多個目標打包。
程式ar配合引數-r建立乙個新庫libhello.a,並將命令列中列出的檔案打包入其中。這種方法,如果libhello.a已經存在,將會覆蓋現在檔案,否則將新建立。

3.鏈結靜態庫

[plain]view plain

copy

print?

gcc main.c -lhello -l. -static -o main  

gcc main.c -lhello -l. -static -o main
這裡的-static選項是告訴編譯器,hello是靜態庫。

或者:

[plain]view plain

copy

print?

gcc main.c libhello.a -l. -o main  

gcc main.c libhello.a -l. -o main
這樣就可以不用加-static

4.執行./main

輸出:call hello()

gcc編譯靜態庫 動態庫

今天,乙個同事編譯靜態庫,我也趁此機會在溫習一下,先google一下,然後在自己實驗。首先,在網上抄個例子,內容如下 建靜態庫 hellos.h ifndef hello s h define hello s h void prints char str endif hellos.c include...

GCC 編譯 靜態庫 動態庫

工作流程 命名格式 lib 庫的名字 so製作 第一步 得到 o檔案 引數 fpic表示生成與位置無關 gcc i.include fpic c c第二步 建立動態庫 shared 製作動態庫 o 重新命名生成的新檔案 gcc shared o lib so o使用 命名格式 lib 庫的名字 a製...

GCC執行過程 gcc編譯靜態庫和動態庫

1 預處理階段 這個階段主要是處理原始檔中的 ifdef include和 define命令 命令 gcc e c o i 2 編譯階段 輸入的是中間檔案 i,編譯後生成組合語言檔案 s 命令 gcc s i o s 3 彙編階段 輸入的是彙編檔案 s,輸出的轉換生成的機器語言 o 命令 gcc c...