将 SWIG 应用于 C++ 时,f1(const char* str) 是否不同于 f1(char* str)?
Is f1(const char* str) different from f1(char* str) when applying SWIG to C++?
我正在应用 SWIG 将 C++ 库转换为 Python 库。
我有一个header文件和一个源文件(琐碎的东西省略):
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
出现如上错误。
但是,在修复 header 和源具有相同参数后,const char* str
,错误已解决。
我想知道的是,为什么 C++ 编译器和构建器不抛出错误或警告,将问题放在 SWIG 中 Python。
的确,char*
和const char*
是不同的类型。
您声明了两个重载函数,但只定义了一个。这不是错误,只要您不尝试调用或以其他方式使用未定义的。如果这样做,您将得到 link 次错误;由于您已经构建了一个动态库,因此只有在加载库时才会检测到它 - 在这种情况下,由您的 Python 解释器检测到。
我正在应用 SWIG 将 C++ 库转换为 Python 库。
我有一个header文件和一个源文件(琐碎的东西省略):
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
出现如上错误。
但是,在修复 header 和源具有相同参数后,const char* str
,错误已解决。
我想知道的是,为什么 C++ 编译器和构建器不抛出错误或警告,将问题放在 SWIG 中 Python。
的确,char*
和const char*
是不同的类型。
您声明了两个重载函数,但只定义了一个。这不是错误,只要您不尝试调用或以其他方式使用未定义的。如果这样做,您将得到 link 次错误;由于您已经构建了一个动态库,因此只有在加载库时才会检测到它 - 在这种情况下,由您的 Python 解释器检测到。