考虑此文件包含两个类似的功能:
#include <iostream>
int main()
{
std::cout << "main\n";
}
int notmain()
{
std::cout << "notmain\n";
}
我将其编译到共享库中:
g++ -shared -Wl,-soname,code -o code.so -fPIC code.cpp
我希望从python调用这些,对于
main
来说,它可以正常工作:import ctypes
libc = ctypes.cdll.LoadLibrary("code.so")
libc.main()
哪个打印
main
。但是,notmain
不起作用:import ctypes
libc = ctypes.cdll.LoadLibrary("code.so")
libc.notmain()
输出:
<ipython-input-63-d6bcf8b748de> in <module>()
----> 1 libc.notmain()
/usr/lib/python3.4/ctypes/__init__.py in __getattr__(self, name)
362 if name.startswith('__') and name.endswith('__'):
363 raise AttributeError(name)
--> 364 func = self.__getitem__(name)
365 setattr(self, name, func)
366 return func
/usr/lib/python3.4/ctypes/__init__.py in __getitem__(self, name_or_ordinal)
367
368 def __getitem__(self, name_or_ordinal):
--> 369 func = self._FuncPtr((name_or_ordinal, self))
370 if not isinstance(name_or_ordinal, int):
371 func.__name__ = name_or_ordinal
我假设main以不同于
notmain
的方式“导出”到外部世界(w.r.t. code.so),因为main
在c++规范中是一种特殊情况。如何以相同方式“导出” notmain
?或者:如何解决该异常?编辑如@abdallahesam所建议,我在
estern "C"
中添加了notmain
,但这并没有改变(或解决)问题:#include <iostream>
int main()
{
std::cout << "main\n";
}
extern "C" {
int notmain()
{
std::cout << "notmain\n";
}
}
更正
该建议确实解决了问题,我只需要重新启动(i)python session 即可。显然这很重要:)
最佳答案
我认为您应该将 extern“C” 添加到 notmain 函数头中,以防止c++编译器更改函数名。