2012-04-30 89 views
1

兩個項目:我可以使用「gcc -llibnamehere」來綁定共享庫嗎?除了靜態庫嗎?

  • 裝載機,一個獨立的可執行(只加載模塊)
  • 任何模塊,共享庫(librainbowdash.so)(也可以有多個模塊)

現在,該模塊與-lpthreads鏈接,但我得到一些奇怪的錯誤,這讓我認爲pthreads只能作爲一個共享對象綁定,並且當加載程序加載模塊pthreads沒有被加載。 (用GDB調試是不可能的,那種錯誤)。

我以爲-l開關只允許靜態庫嗎?可以?不是嗎?

+0

它沒有。 '-l'僅用於方便的路徑查找。用於'librainbowdash.so'的 –

+0

+1! – Miguel

回答

2

-l指定庫名稱。由鏈接器根據需要將庫名解析爲靜態庫或共享對象以進行鏈接。加載器的工作是加載任何使用的共享庫。

+0

這就是我的想法。有沒有辦法強制它是一個靜態庫?我想在.a版本中有libpthreads.so可用.. – imacake

+0

取決於鏈接器。使用GNU ld,你可以在'-l'參數之前使用'-static'。 –

0

可能是因爲您的共享庫在錯誤的位置指向lpthread。使用ldd工具,例如ldd libfoo.so通常是找到這種鏈接問題的非常有效的方法。

1

如果您在LD和gcc手冊頁看,它可以定義「選項組」,我可能會有點生疏,但它應該像

gcc -o yourprog -Wl,-Bstatic yourprog.c -lstatic_lib -Wl,-Bdynamic -ldynamic_lib 

確切的咒語很可能是錯的。根據經驗,通過靜態庫的完整路徑已證明比找出上述咒語的確切形式更令人頭疼。

這就是說,我懷疑你會通過靜態鏈接pthreads獲得很多好處。

我想你可能也使用

gcc -pthread ... 

爲好。

使用簡單的靜態將使輸出及其所有依賴項靜態。這可能不是你想要的。