其中 hello.c 和 main.c 在同乙個目錄下, hello.h在上乙個目錄。#include
void print_hello()
#include
#include "hello.h"
int main()
#define hello 9999
void print_hello();
先生成 ***.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 生成動...