討論區快速選單
知識庫快速選單
網路投保旅行平安險 掌握Salesforce雲端管理秘訣 傑米的攝影旅遊筆記
[ 回上頁 ] [ 討論區發言規則 ]
GCC 區別連結靜態與動態程式庫的問題
更改我的閱讀文章字型大小
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 408 | 人氣 0 | 評價 1890 | 評價/貼文 4.63 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/6/18 下午 01:16:42
狀況是這樣的,我在 gcc 選項中加上 -lname 就可以連結 name 這個程式庫(name 這個名字是隨意的)。
很多的程式庫都會同時建置靜態、以及動態的程式庫供我們使用,但很多時候他們卻擁有同樣的名稱,如:

libname.a
libname.so

這樣產生了一些困擾,就是當我使用 -lname 時他似乎預設會連結動態的版本,我反而不能隨意的選擇我要連結靜態版本還是動態版本。
我目前的做法是手動把程式庫檔案改名成像是這樣:

libname_static.a
libname.so

可是還是想問問,是不是有什麼比較正規的操作方法可以讓我們選擇要連結哪一個版本的程式?
作者 : ozzy123(ozzy) VC++優秀好手資訊類作業求救卓越專家C++卓越專家貼文超過4000則人氣指數超過30000點
[ 貼文 4499 | 人氣 37262 | 評價 11100 | 評價/貼文 2.47 | 送出評價 49 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人ice_emissary註記此篇回應為很有道理 2015/6/18 下午 02:01:46
http://www.coctec.com/docs/program/show-post-71590.html
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 408 | 人氣 0 | 評價 1890 | 評價/貼文 4.63 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/6/18 下午 02:57:31
感謝 ozzy 大大的幫忙,原來可以用 -Wl,-Bstatic 或 -Wl,-Bdynamic 來切換要連接的程式庫。

不過我試了後又發生一另一個好笑的問題:
gcc abc.o -Wl,-Bstatic -lname

結果出現了:
/usr/bin/ld: cannot find -lgcc_s

看來應該是我下了 -Wl,-Bstatic 後,他全都變成靜態連結,然後有些引含的程式庫就連不到了…
我試著改成這樣,就可以編譯成功:
gcc abc.o -Wl,-Bstatic -lname -Wl,-Bdynamic

但總覺得事情變得愈來愈複雜…
作者 : turing(Alan)
[ 貼文 68 | 人氣 0 | 評價 300 | 評價/貼文 4.41 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/6/19 上午 09:55:30
有無試過-lname.a或-l/your-lib-path/name.a?
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 408 | 人氣 0 | 評價 1890 | 評價/貼文 4.63 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/6/20 下午 10:15:20
-lname.a 這方法不行,因為 -l 指定的名稱是有規範的,所以實際上會連不到東西。
-l/your-lib-path/name.a 這方法也沒什麼用,因為靜態庫和動態庫是放在一起的;如果要把他們分開放來做出區別的話,我覺得原來的修改檔名辦法還比較簡單。
作者 : turing(Alan)
[ 貼文 68 | 人氣 0 | 評價 300 | 評價/貼文 4.41 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人ice_emissary註記此篇回應為很有道理 2015/6/22 上午 08:26:32
是的,忘了名字規定!

直接用 gcc -o program source_a.c source_b.c ... name.a 便可。

Libraries是可直接送入編譯器的。-l是提供方便,在指定的lib path去找name.so, libname.so, name.a及libname.a送入編譯器進行連結。
作者 : ice_emissary(燃燒的大地) 貼文超過200則
[ 貼文 408 | 人氣 0 | 評價 1890 | 評價/貼文 4.63 | 送出評價 18 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2015/6/24 下午 09:44:09
>直接用 gcc -o program source_a.c source_b.c ... name.a 便可。

看起來這個方法似乎是除了改名以外最實際的做法了!
 板主 : maple-leaf
 > UNIX - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - UNIX - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
UNIX
1 Anderson 1130 
2 old cat 450 
3 maple-leaf 420 
4 MooCow 310 
5 又改暱稱 290 
6 青衫 200 
7 sazabi 200 
8 member one 200 
9 愛睏魚 190 
10 pail 160 
UNIX
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
3.198242E-02