2013-04-26 20 views
1

在與我的makefile問題作鬥爭之後,我現在討論了兩個庫應該如何交互的問題。所以,這是在Linux上(CentOS 6.2 - 6.4,這似乎在工具方面差異很大)。項目,從總體上看,是兩種口味在混合庫類型(靜態和動態)方面存在問題

,其用於與其他C++ appications聯(A *某文件)
  • A C++靜態庫
  • 共享*。所以要被部署通過蟒蛇使用Boost.python部署

我有一切編譯,但我沒有正確鏈接。在靜態庫的情況下,它是建立在兩個方面:

  • 如果爲了與其他C++代碼鏈接,-fPIC使用
  • 如果意味着要鏈接到Python模塊, 使用-fPIC

我通過傳遞參數給make程序進行控制。目前,我正在嘗試構建boost python模塊,因爲靜態的東西編譯得很好。所以,我依賴boost庫和zlib。最終連接命令看起來像這樣:

g++ -o pythonmod.so -L/boost/boost_libs -L/zlibs -lz -lboost_python -lboost_thread -lboost_regex -lboost_system /path/to/static.a -fPIC -shared [many_objects] 

的「many_objects」來自於各種包裝,和其他代碼,即從包裝在代碼中的Boost.Python層中的「純」 C++。這些目標文件中的每一個都使用-fPIC編譯。他們編譯爲:

g++ -I/boost/boost_1_47 -I/usr/include/python2.6 -D _linux -MMD -std=c++0x -c -m32 -fPIC <input> -o <output> 

編譯歸檔文件的目標文件的行看起來與上面非常相似,只是它們不包括python include目錄。

我在這裏發現了類似問題的其他鏈接,並嘗試瞭解決方案,但迄今爲止無濟於事。例如,this link使用-Wl,--whole-archive ... -Wl,--no-whole-archive。我在嘗試在靜態庫存檔中鏈接-fPIC之前嘗試使用此解決方案。現在,我正在這樣做,我試過this solution,但也無濟於事。在每種情況下,每次我加載python並導入模塊時,都會遇到某種未定義的符號錯誤 - >鏈接期間出錯。

我應該如何將這些庫混合在一起以使python模塊工作?

回答

0

加入gcc-help郵件列表後,我收到了解決問題所需的指針。問題原來是用於在構建命令行上進行鏈接的庫的排序。基本上,構建期間爲* .so生成的目標文件需要首先放置。然後,引用boost和其他庫。重新排序目標文件以引用在其他庫之前構建的用於封裝靜態庫的對象是關鍵。加載我的python模塊時,我不再看到奇怪的「未解決的對象」。

在使用Visual Studio 4或5年後,我的gcc知識已經變得足夠生鏽,以至於我忘記了鏈接時排序的重要性。