簡體   English   中英

為靜態庫編譯SWIG Python包裝器?

[英]Compiling a SWIG Python wrapper for a static library?

這是一個菜鳥問題。 我正在嘗試學習如何使用SWIG為C ++庫制作python接口。 該圖書館是第三方專有的圖書館; 它以頭文件(foo.h)和靜態存檔(libfoo.a)的形式出現。

為了簡化問題,我准備了一個我認為具有相同病理的示例。 無論如何,同樣的錯誤消息。

/* foo.hpp */
class TC {
    public:
       TC();
       int i;
    private:
};

供參考,這里是foo.c。 我只有真正的第3方庫的頭文件和存檔文件。

/*foo.cxx */
#include "foo.hpp"
TC::TC() {
    i = 0;
}

我通過輸入g++ -c foo.cxx && ar rcs libfoo.a foo.o了這個庫

我的SWIG接口文件如下:

/* foo.i */ 
%module foo
%{
#include "foo.hpp"
%}
%include "foo.hpp"

我通過鍵入生成foo_wrap.cxx

swig -python -c++ foo.i

然后編譯。

g++ -c -fPIC -I/usr/include/python2.6 foo_wrap.cxx 
g++ -shared -L. -lfoo -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -o _foo.so

編譯成功,但是當我運行Python並import foo ,出現未定義的符號錯誤。

>>> import foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
  File "foo.py", line 25, in <module>
    _foo = swig_import_helper() 
  File "foo.py", line 21, in swig_import_helper
    _mod = imp.load_module('_foo', fp, pathname, description)
ImportError: ./_foo.so: undefined symbol: _ZN2TCC1Ev

這里發生了什么? 問題似乎是鏈接步驟沒有找到構造函數TC :: TC的定義。

注意:如果我將鏈接步驟更改為

g++ -shared -L. -lfoo -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -o _foo.so

然后一切正常。 但這是我沒有原始源代碼的真正問題的一個選擇嗎? 可以從.a中提取.o嗎? 大概可以手工完成,但是不應該有一些自動化的方法嗎?

我不太確定是否適合您,但總的來說,目標文件和靜態庫的順序很重要。 該順序定義了初始化的順序。

您必須將最通用的對象和/或靜態歸檔作為最后一個參數。 具有最高依賴性的對象/歸檔必須放在開頭。

一個例子。 目標文件Ao提供功能A()。 對象Bo使用函數A()。 您必須編寫ld -o libmy.so Bo Ao (最通用的文件Ao作為最后一個參數)。

您也可以使用objdump -x _foo.so檢查文件中是否存在符號。

正確的調用是: g++ -shared -L. -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -lfoo -o _foo.so g++ -shared -L. -lpython2.6 -Wl,-soname,_foo.so foo_wrap.o -lfoo -o _foo.so

不要與-lpython2.6混淆,它是在運行時 鏈接的動態庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM