2012-07-06 73 views
0

我正在開發一個程序,它生成某些部分作爲c/C++庫。 例如它會創建目錄 - lib1,lib2,..,libN。 對於每個庫,它生成c/C++代碼+ Makefile,然後使用gcc/g ++ + ld,最後它調用庫中的代碼。 現在的問題是,如果lib1具有函數fun和libN,那麼當從libN調用fun時,將使用lib1。 我已經嘗試不同版本的gcc/g ++到v4.7。gcc/g ++/ld緩存?

回答

3

現在的問題是,如果lib1有一個函數fun和libN,當從libN調用fun時,會使用lib1。

想必你正在談論共享庫,而不是歸檔庫(在那裏你會得到一個多重定義的符號錯誤)。

是的,這是它應該如何工作的,並且總是有在UNIX上工作。緩存有什麼也沒有與它做。

如果你在ELF平臺上,你也許能使其利用-Wl,-Bsymbolic工作更類似於Windows,但你會戰鬥系統默認的行爲,應該期望坎坷不平,和許多意想不到的疑難雜症的的。如果fun不需要從libX公開,隱藏symbol visibility是你的朋友。

由於您正在生成lib1,... libN的代碼,因此可能更容易避免使用例如名稱衝突。 libX_fun而不是fun。這也會更便攜,因爲它只會在任何地方工作。

更新:

函數名具有真正根據接口規範是有趣的。

根據誰的接口規格?

你顯然控制了主程序和庫。所以你可以,而且可能應該改變接口規範來避免這個問題。

+0

根據接口規範,函數名稱真的很有趣。 – nil 2012-07-08 10:04:47

+0

'-Wl,-Bsymbolic'沒有幫助。但是,我在libX完成工作後立即使用'dlclose'解決了這個問題。如果我想同時使用'lib1',','libN',這將不起作用。 – nil 2012-07-08 10:10:48

+0

有一個預編譯的調用'fun'的MATLAB代碼,在運行時重新編譯它會代價太大。 – nil 2012-07-09 00:00:25