歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> GCC 靜態庫和動態庫

GCC 靜態庫和動態庫

日期:2017/3/1 10:22:52   编辑:Linux編程
//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 ==>運行的時候出錯,說明程序運行的時候需要庫!

Copyright © Linux教程網 All Rights Reserved