2012-05-03 90 views
0

不幸的是,我不能發佈這個源代碼,但我會盡量設置它,盡我所能。我有一個dynamic_cast未能轉換爲派生類類型的情況,我知道它應該成功(即我知道實例的實際類型)。 另外一個堆分配的對象的typeid不等於一個堆棧分配對象的typeid! IE,C++運行時類型與Python模塊不匹配?

Foo mstack; 
Foo*mheap = new Foo(); 
typeid(mstack) == typeid(*mheap); // returns FALSE!? 

因此,在某個地方顯然存在RTTI問題。類實現(對於基類和派生類)都在一個共享庫中,故障代碼位於第二個共享庫中,該庫在Python解釋器中作爲Python模塊加載(所有這些在Linux上,使用gcc 4時都是同樣的問題,英特爾C++編譯器)。如果我編寫一個連接兩個共享庫的簡單小測試可執行文件,一切正常。我已經試過--export-dynamic在鏈接共享庫時沒有成功(看起來像是用於可執行文件)。 任何人有什麼指望去哪裏看? Python使用dlopen()會導致這種問題嗎?

+0

你有沒有嘗試過創建一個重現問題的最小例子? –

+0

這有點含糊。你的例子處理'typeid'操作符,但是沒有'Foo'的定義,沒有辦法確定爲什麼比較的結果是false,因爲它不會用於'class Foo {};'。然後,繼續描述鏈接共享庫和python的問題,這些與此無關。 – AJG85

+0

@ AJG85 - 由於我無法包含源代碼,所以很遺憾有點含糊。我認爲與python的鏈接必須相關,因爲在與簡單的可執行文件鏈接時,一切正常。但我希望有人會有一些知識能夠指導我正確的方向,所以即使它們是間接的,也是非常有用的。 – user1372826

回答

0

這是由Python加載擴展模塊RTLD_LOCAL引起的,解決方法是強制Python使用RTLD_GLOBAL來加載它(請參閱OP的評論)。