考虑此文件包含两个类似的功能:

#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++编译器更改函数名。

08-19 20:25