2011-04-13 144 views
1

問候。如何解決未解決的符號?

我有我的lib動態鏈接到我的程序有問題。 以下是發生了什麼:我正在開發一個模塊化程序並測試模塊系統。事情是我的模塊使用了一些在主要二進制文件中定義的類:一些抽象類,它們不會引起任何問題,還有一個非常具體的類,它們無法解決。

我使用的dlopen/dlsym進行/ dlclose的功能集。 而我使用g ++進行編譯。

的事情是:如果我問的dlopen加載所有的符號,那麼它沒有告訴我"undefined symbol: _ZNK3zia3api8DataTreecvRKSsEv 但是,如果我在懶惰模式推出dlopen的,它只會在所謂類的第一次使用發生(和在那之後崩潰)。

因此,這是「的Datatree」類的,我希望把它同時適用於主二進制和模塊。 我已經試着在每個二進制文件中進行編譯:正如我所料,它不起作用。 我也嘗試完全內聯,但它和我的其他嘗試一樣沒用。 我試圖用選項「-rdynamic」編譯主二進制文件。沒有變化。

我一直在尋找,詢問朋友從昨天開始,但似乎沒有人知道如何解決這類問題。

我編譯模塊的對象的選項-fPIC,像這樣:

g++ -Wall -fPIC -c mysource.cpp 

然後我用這條線使圖書館:

g++ -shared -Wl,-soname,mylib.so.1 -o mylib.so mysource.o 

我想最好的解決辦法將不會編譯庫中的對象,而是從主二進制文件中提供該符號。 所以問題是:怎麼做? (這是我必須做的嗎?)

+1

demangled name是zia :: api :: DataTree :: operator std :: string const&()const – 2011-04-13 12:34:59

+1

您可以使用'C++ filt'實用程序(在linux上)獲取demangled名稱。調用只是'C++ filt _ZNK3zia3api8DataTreecvRKSsEv',結果是@Industrial發佈的內容。非常便利! – 2011-04-13 12:37:56

+0

好主!這確實是不確定的!我沒有注意到它!非常感謝 ! – Michael 2011-04-13 12:44:00

回答

0

嘗試將-rdynamic添加到庫模塊而不是主程序,並確保所有具有虛擬方法並且被繼承的類都具有虛擬析構函數。另一個建議:做一個最簡單的例子並在這裏發佈。

+0

導致它的類沒有任何虛方法,除了它的析構函數。我也進行了雙重檢查:我已經使用了-rdynamic,並且現在在主二進制文件和庫上執行它(以防萬一)。仍然沒有變化:/! – Michael 2011-04-13 12:38:53