我對這個網站的第一篇文章與巨大的希望:: 我想了解靜態鏈接,動態鏈接,共享庫,靜態庫等與海灣合作委員會。每次我試圖深入研究這個話題時,我都有一些我不太明白的東西。在海灣合作委員會如何在運行時強制符號解析
一些實踐工作:
bash$ cat main.c
#include "printhello.h"
#include "printbye.h"
void main()
{
PrintHello();
PrintBye();
}
bash$ cat printhello.h
void PrintHello();
bash$ cat printbye.h
void PrintBye();
bash$ cat printbye.c
#include <stdio.h>
void PrintBye()
{
printf("Bye bye\n");
}
bash$ cat printhello.c
#include <stdio.h>
void PrintHello()
{
printf("Hello World\n");
}
gcc -Wall -fPIC -c *.c -I.
gcc -shared -Wl,-soname,libcgreet.so.1 -o libcgreet.so.1.0 *.o
ln -sf libcgreet.so.1.0 libcgreet.so
ln -sf libcgreet.so.1.0 libcgreet.so.1
所以我創建了一個共享庫。 現在我想鏈接這個共享庫與我的主程序來創建一個可執行文件。
gcc -Wall -L. main.c -lcgreet -o greet
它很好的工作,如果我跑迎接(或rpath的選項鍊接的話)之前設置LD_LIBRARY_PATH我可以使它發揮作用。
然而,我的問題是不同的: 因爲我無論如何都使用共享庫,是不是可以在運行時強制進行符號解析(根據本書「鏈接器和加載器」不知道術語,也許稱爲動態鏈接) 。我明白我們可能不想這樣做,因爲這會讓程序運行緩慢,每次我們想運行該程序都會產生開銷,但我正試圖理解這一點以清除我的概念。
gcc鏈接器是否提供任何選項來延遲運行時的符號解析? (要與我們實際上要運行該程序的庫一起使用)(因爲在編譯時可用的庫可能與運行時可用的庫不同(如果庫中有任何更改) 我希望能夠做某事:
bash $ gcc main.c -I。
(在這裏需要什麼選項?) 這樣我就不必提供庫名稱,只是告訴它我想在運行時進行符號解析,所以頭文件對於現在來說足夠好,實際的庫名稱不需要。
謝謝, 永遠的學習者。
http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html – adf88 2010-07-01 13:07:39
請確保您使用適當的語言標記問題。它被標記爲C++,但代碼是C.請注意,爲了能夠使用純動態庫加載C++中的代碼,需要包含額外的'extern「C」',它們不需要,也不需要在C中有效。 – 2010-07-01 15:28:33