3

.so ファイルを作成した C++ コードがいくつかあります。

私の目的は、この .so ファイルを Python スクリプトにロードすることです。

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 に答える