Python脚本加载.so文件时出现未定义符号错误

3
我有一段C++代码,并创建了一个.so文件。我的目标是在python脚本中加载这个.so文件。为了暴露C++方法,我为它们创建了一个C封装方法并暴露了C方法。然而,在尝试在python脚本中加载.so文件时,出现了Undefined symbol错误。这些错误是用于某些C++类中的内部使用方法,并未从.so文件中暴露出来。(nm -C -u .so)
以下是需要解决的问题:
  1. 当创建.so文件时,名称不应该已经解析吗?
  2. 如何解决.so文件中的未定义符号最佳方法?
例如:
C++ :
class myclass {
public:
     void func1(int _i);
     int getval();
};

C wrapper :
extern "C" int getval_w();

int getval_w() {
    myclass obj;
    return obj.getval();
}

当我将这段代码编译成.so文件并在python脚本中加载时,会出现以下错误: 未定义的符号:“func1的重载名称”


即使您正确暴露符号,也无法从Python内部运行此函数。 您需要遵循Python扩展指南:http://docs.python.org/2/extending/ - jogojapan
2
我正在Python脚本中调用从.so文件中暴露出来的函数。不要认为所有都是必需的,因为在我的样本测试代码中一切都正常工作。 - Dexter
1个回答

2

在链接.so文件时,如果忘记包含定义这些函数的对象(.o文件),则会出现问题。

当链接共享对象时,默认情况下,链接器不会因为未解析的符号而产生错误,因为这些符号可能由另一个对象在将库链接到最终可执行文件时提供。您可以使用--no-undefined 链接器标志明确告诉链接器产生该错误。要通过g++(或clang++)驱动程序传递它,您需要将其写成-Wl,--no-undefined


谢谢,是我的错误。在制作文件中找到了缺失的对象文件。 - Dexter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接