3

我有一些 C++ 代码,为此我创建了一个 .so 文件。

我的目标是在 python 脚本中加载这个 .so 文件。

为了公开 C++ 方法,我为它们创建了一个 C 包装方法并公开了 C 方法。

但是,当尝试在 python 脚本中加载 .so 文件时,它给了我一个未定义的符号错误。

这些错误适用于某些 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 的损坏名称”

4

1 回答 1

2

.o在链接.so.

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

于 2012-11-01T10:00:05.483 回答