gcc 靜態庫和動態庫

2021-06-06 10:47:56 字數 1624 閱讀 2027

#include

void print_hello()

#include

#include "hello.h"

int main()

#define hello 9999

void print_hello();

其中 hello.c 和 main.c 在同乙個目錄下, hello.h在上乙個目錄。

先生成 ***.o 檔案

$ gcc hello.c -c ==> hello.o

$ gcc main.c -c ==> error : no hello.h

$ gcc main.c -c -i ../ ==> main.o -i 指定標頭檔案的搜尋目錄( i 是大小的 i)

$ ls ==> hello.o main.o hello.c main.c

$ ar cr libhello.a hello.o ==> libhello.a (注意順序)

$ gcc main.o -o main.out -lhello==> error : /usr/bin/ld: cannot find -lhello,意思是找不到庫 -l 是小寫的l

1.linux下預設gcc搜尋是按照ld_library_path來搜尋的,標準庫(動態庫和靜態庫)都在 /usr/lib/ 下面

2.-lhello是一種約定,表示搜尋 libhello.a 或者 libhello.so 的庫,-l***x 即 lib***x.a 或者 lib***x.so

3. 可以用-l 來指定載入庫的目錄

$ gcc main.o -o main.out-l . -lhello ==>出現了main.out,成功!

$ rm libhello.a -f ==>程式照樣能執行,說明靜態庫是鏈結程序式的!

$ gcc hello.o -o libhello.so -shared ==> libhello.so

$ gcc main.o -o main.out -l . -lhello ==> -l指定庫所在路徑,-lhello指定libhello.a 或者 libhello.so

$ ./main.out ==> error while loading shared libraries: libhello.so: cannot open shared object file: no such file                    or directory

動態鏈結庫是在程式執行時候去載入的,載入的時候是從標準目錄/usr/lib下去尋找的,下面是三種解決方法

1. $ cp libhello.so /usr/lib/ ==> libhello.so拷貝到/usr/lib/下去

2. export ld_library_path=$ld_library_path:.

// export ld_library_path=$ld_library_path :

3 . /etc/ld.so.conf 裡面加一行所在庫的目錄,然後執行 ldconfig

/etc/ld.so.conf檔案:除了標準目錄(/lib和/usr/lib)之外,鏈結器和載入器搜尋共享庫時要檢查的其他目錄,和這個檔案相關的乙個命令是:ldconfig

$ rm libhello.so ==>執行的時候出錯,說明程式執行的時候需要庫!

GCC靜態庫 動態庫

1 靜態庫 linux環境下的靜態庫的擴充套件名為 a step 1 編譯原始檔,生成可重定位目標檔案 gcc c static lib.c step 2 使用ar工具建立乙個靜態庫,或者將目標檔案加入到乙個已經存在的靜態庫中。格式 ar rcs 靜態庫名 目標檔案2 目標檔案2 目標檔案n ar ...

gcc編譯靜態庫和動態庫

一 動態鏈結庫 1.建立hello.so動態庫 cpp view plain copy print?include voidhello 編譯 gcc fpic shared hello.c o libhello.so include void hello 編譯 gcc fpic shared hel...

gcc生成靜態庫和動態庫

假設當前目錄下有這些原始檔 main.c func.c func.h 其中main.c要呼叫func.c中的函式。生成靜態庫 gcc c func.c o func.o ar rcs libfunc.a func.o gcc main.c o main static l.lfunc main 生成動...