2013-02-06 25 views
0

我在Linux中創建了一個共享庫(.so),我面臨一個非常奇怪的問題。 最初我在庫中添加了3個函數(write_myown,setfolder,register),然後我又添加了一些(init,write_re)。Linux上我自己的共享庫中的某些函數鏈接問題

基本上整個庫都是用C++實現的,但是這些API需要從基於C和C++的可執行文件中調用。因此我使用extern「C」作爲API。

我面臨的奇怪問題是,當我嘗試使用函數 write_myown,setfolder和register時,鏈接將通過並創建可執行文件。

但是,當我嘗試調用函數init或write_re鏈接失敗,與未定義的引用錯誤。

即使是我認爲但並不確定的陌生事物,我猜想當我構建C程序時它只能正常工作,但是當我構建基於C++的代碼時,可以看到此問題。

我已經檢查並確認以下事項

  1. (的.so)在/ usr/lib目錄中現有的庫(我把它放在那裏)
  2. -p LDCONFIG | grep mylibname顯示我的庫存在。
  3. 當我不調用init或write_re時,生成可執行文件,objdump/readelf顯示相應的引用。
  4. ldd在mylibrary.so上同時顯示init和write_re都存在,可見性是全局的。
  5. 創建的可執行文件或.0顯示對mylibrary的正確依賴關係。
  6. 沒有版本的mylibrary。
  7. 我已確認它引用了正確的.so。
  8. nm在我的庫上顯示所有功能都存在。

任何想法如何我可以解決這個問題?可能是什麼問題。 如果不是我可以繼續調查。 請讓我知道是否需要任何進一步的細節。

最好的問候, 帕

+1

'write'是'libc.so.6'中的一個函數,'register'是關鍵字。你應該使用不同的名字... –

+1

如果給出一個C接口,通常讓所有的符號共享一個共同的前綴....所以重命名所有的函數,以便tkeir名稱以例如「 'pavan_' –

+0

嗨巴西爾,感謝您的回覆,抱歉,我沒有使用任何標準函數名稱。 – PavanMysore

回答

0

我對着奇怪的問題是,當我嘗試使用write_myown的功能,setfolder並註冊,連接會突破並創建可執行文件。

但是,當我嘗試調用函數init或write_re鏈接失敗,與未定義的引用錯誤。

我的電子結構球說:當你在你.h文件寫道原型write_myownsetfolder,您添加extern "C"他們。

但是當你後來添加write_re,你把extern "C"他們的定義在.cc文件,但忽略了將其添加到他們的原型在.h

如果是這樣,

  • 的功能是定義與庫中它們的非錯位形式,並且
  • C可執行文件可以精細使用它們,以及
  • 一個C++對象引用他們(在圖書館外)不是看到extern "C"對他們,所以想他們的mangled形式(當然這是不是由圖書館提供)。

這個假設,我認爲目前適合所有的事實,你的問題,是微不足道的驗證:沒從鏈接錯誤消息說undefined symbol: write_re,還是它說undefined symbol: write_re(some, parameter, types)

如果是後者,那是某個對象引用損壞的名稱的死件。