0

私はC初心者なので、これはばかげた質問かもしれません。を介してPythonにインポートするという明確な目的のために、Cオブジェクト(.oファイル)の.soファイル(用語が正しい場合は共有ライブラリ)をコンパイルしようとしていますctypes。私は最初に*.soをコンパイルしました

gcc -shared -o libvARAM.so ARAM.o ARAM_io.o io.o pre.o rule.o stat.o ART.o vARAM.o

これは機能しましたが、ctypesを介してロードしようとすると、次のような報酬が得られました。

OSError: ./libvARAM.so: undefined symbol: max

少し掘り下げてみると、maxは標準のC関数ではないことに気づきました。電話をldd libvARAM.soかけると、依存関係の1つがですlibc.so.6。へのシンボリックリンクを作成してlibc.soからlibc.so.6、.soを次のように再コンパイルしてみました

gcc -shared -o libvARAM.so ARAM.o ARAM_io.o io.o pre.o rule.o stat.o ART.o vARAM.o -llibc

生成された

/usr/bin/ld: cannot find -llibc

も試してみると同じエラーが発生します-L/lib/i386-linux-gnu/ -llibc。私はこのスレッドを知っていますが、makefileの解決策があるため、私の状況とは関係がないと感じています。これが問題になる場合は、Xubuntuを使用しています。

どんな助けでも心から感謝します!

4

2 に答える 2

2

1: リンカー フラグはそのようには機能しません。の場合libXYZ.so、対応するリンカ フラグは NOT-llibXYZのみ-lXYZです。

2: C 標準ライブラリ ( -lc) は実行可能ファイルに自動的にリンクされるため、これも必要ありません。

3: 最も可能性の高い問題は、ヘッダー ファイルの 1 つに (関数ではなく)max() マクロが定義されているはずですが、このヘッダー ファイルをインクルードしていないため、コンパイラはそれがマクロであることを認識せず、それは関数として - もちろん libc.so にはありません。そこにないからです。

于 2012-09-01T17:00:50.093 に答える
0

これを投稿して、他の初心者がそれを見ると、答えが表示されます...基本的に、私のヘッダーファイルは次のとおりです。

#ifdef UNIX
#define min(x, y) (x<y ? x : y)
#define max(x, y) (x<y ? y : x)
#endif

最初と最後の行を削除 (つまり、ifdefチェックなし) すると、コンパイラはこれらの定義を読み取ることができます。どうやらそれはそれらを読んでいなかったようです。

于 2012-09-02T19:56:16.333 に答える