//hello.c #include void print_hello() { printf("HelloWorld "); } //main.c #include #include "hello.h" int main() { print_hello(); printf("%d",HELLO); return 0; } //hello.h #define HELLO 9999 void print_hello();
其中 hello.c 和 main.c 在同一個目錄下, hello.h在上一個目錄。
先生成 xxx.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 的庫,-lXXXX 即 libXXXX.a 或者 libXXXX.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 : <path of libxxxx.so>
3 . /etc/ld.so.conf 裡面加一行所在庫的目錄,然後執行 ldconfig
/etc/ld.so.conf文件:除了標准目錄(/lib和/usr/lib)之外,鏈接器和加載器搜索共享庫時要檢查的其他目錄,和這個文件相關的一個命令是:ldconfig
$ rm libhello.so ==>運行的時候出錯,說明程序運行的時候需要庫!