2015-04-01 91 views
1

我正在應用SWIG將C++庫轉換爲Python庫。將SWIG應用於C++時,f1(const char * str)與f1(char * str)不同?

我有一個頭文件和源文件(瑣碎的事情被忽略):

test.h

void f1(char* str); 

test.cc

void f1(const char* str) { 
    /* do something */ 
} 

當我建立它,它不會拋出任何關於這種不匹配的錯誤或警告。

但是,當我輸入在Python通過SWIG生成我的模塊:

>>> import (MYMODULE) 
ImportError: /usr/local/lib/libMYMODULE.so: undefined symbol: _ZN2f14str12iii 

這樣的錯誤發生以上情況。

但是,在將頭文件和源文件固定爲具有相同參數後,const char* str,錯誤已得到解決。

我想知道的是,爲什麼C++編譯器和構建器不會拋出錯誤或警告,把它放在SWIG和Python中成爲問題。

+0

另外,像'echo _ZN2f14str12iii | C++ filt'會通過對名稱進行修飾來告訴你缺少哪個(如果缺少'char *'或'const char *',我不清楚它的名稱)。它看起來應該在本機模塊的編譯/鏈接期間失效,而不是在轉換到Python期間。 – jww 2015-04-01 11:12:15

回答

2

確實,char*const char*是不同的類型。

您聲明瞭兩個重載函數,並且只定義了一個函數。這不是一個錯誤,只要你不嘗試打電話或以其他方式使用未定義的那個。如果你這樣做,你會得到一個鏈接時錯誤;因爲您已經構建了一個動態庫,只有在庫加載時才能檢測到 - 在這種情況下,由您的Python解釋器加載。

相關問題