- 論壇徽章:
- 1
|
實(shí)驗(yàn)如下:
同時(shí)編寫三個(gè)源碼文件
hello.c- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int main ( void )
- {
- hello1();
- hello2();
- return 0;
- }
復(fù)制代碼 hello1.c- #include <stdio.h>
- #include <stdlib.h>
- void hello1()
- {
- printf("hello , i am hello1\n");
- return;
- }
復(fù)制代碼 hello2.c- #include <stdio.h>
- #include <stdlib.h>
- void hello2()
- {
- printf("hello , i am hello2\n");
- return;
- }
復(fù)制代碼 先將 hello1.c 和 hello2.c 編譯成動(dòng)態(tài)鏈接庫 libhello.so
再將 hello1.c 和 hello2.c 編譯成靜態(tài)鏈接庫 libhello.a
如何編譯成動(dòng)態(tài)庫和靜態(tài)庫,請(qǐng)搜索論壇 sco 版塊,記得 sunlan 老大曾發(fā)過一個(gè)帖子,不再重復(fù)敘述。
下面是關(guān)鍵的一步。
我們首先看看:
cc -o hello hello.o -L. -lhello
編譯會(huì)生成一個(gè) hello 的可執(zhí)行文件,我們執(zhí)行一下看看,咦,咋提示找不到動(dòng)態(tài)鏈接庫 libhello.so ?
進(jìn)行如下操作:
LD_LIBRARY_PATH=${LIBRARY_PATH}:/usr/work/src/test/
export LD_LIBRARY_PATH
再執(zhí)行一下看看? ./hello
OK , 程序順利的打出兩行。
由此可見,前面的編譯操作鏈接的是動(dòng)態(tài)鏈接庫 libhello.so
我們?cè)賮韴?zhí)行編譯操作
cc -dn -o hello hello.o -L. -lhello
編譯同樣會(huì)生成一個(gè) hello 的可執(zhí)行文件。
清除 LD_LIBRARY_PATH 環(huán)境變量
unset LD_LIBRARY_PATH
set 一下看看,我們發(fā)現(xiàn)環(huán)境變量 LD_LIBRARY_PATH 已經(jīng)被清除了。
再次執(zhí)行一下看看 ./hello
程序順利打出兩行信息。
總結(jié):
在默認(rèn)情況下,cc 編譯成可執(zhí)行文件的時(shí)候,如果在 -L 指向的路徑下同時(shí)存在動(dòng)態(tài)鏈接庫和靜態(tài)鏈接庫,系統(tǒng)默認(rèn)鏈接的是動(dòng)態(tài)鏈接庫。
cc -o hello hello.o -L. -lhello 相當(dāng)于是 cc -dy -o hello hello.o -L. -lhello
如果強(qiáng)制編譯器鏈接靜態(tài)庫,應(yīng)使用 -dn 的參數(shù)
cc -dn -o hello hello.o -L. -lhello |
|