1

バージョン 3.9.0 の ocilib (libocilib.a) に対していくつかのコードをコンパイルする際に問題があります。

$ ls
libocilib.a ocilib.h test.c

$ gcc -o テスト -L. -locilib test.c
/tmp/cc4071VP.o: 関数 `main' 内:
test.c:(.text+0x27): OCI_Initialize への未定義の参照
test.c:(.text+0x64): OCI_ConnectionCreate
テストへの未定義の参照。 c:(.text+0x9d): OCI_StatementCreate への未定義の参照
test.c:(.text+0xaf): OCI_ExecuteStmt への未定義の参照
test.c:(.text+0xb8): OCI_GetResultset への未定義の参照
test.c:(.text +0xcc): OCI_GetString
test.c:(.text+0xdd) への未定義の参照: OCI_FetchNext への未定義の参照
test.c:(.text+0xe6): OCI_Cleanup への未定義の参照
collect2: ld は 1 つの終了ステータスを返しました

Ok。その場合:

$ 文字列 libocilib.a | grep OCI_Initialize
OCI_Initialize
OCI_Initialize
OCI_Initialize
OCI_Initialize

別のページで男 (ビンス) 自身が答えたこの問題 の解決策がありましたが、それは私にとってはうまくいきません。

.soに対してコンパイルしようとすると、何が機能しますか:

$ ls
libocilib.so* libocilib.so.3* libocilib.so.3.9.0* ocilib.h test.c

$ gcc -o テスト -L. -locilib test.c
$

プログラムも期待どおりに実行されます (もちろん、LD_LIBRARY_PATH を変更した後です!)。

前述のソリューションにはいくつかの定義が含まれて-DOCI_IMPORT_LINKAGEおり、-DOCI_CHARSET_ANSI 私はこれらの両方を試しました (オンライン ドキュメントでは、DOCI_IMPORT_LINKAGE はライブラリ自体のコンパイル中にのみ使用されると書かれていますが、それよりも実際のオラクル ライブラリのリンクに関連していると想定していました)。 ocilib を実行します。

そういえば、質問に答えるのに役立つ場合は、 ./configure に--with-oracle-import=runtimeフラグを渡して、ライブラリをコンパイルしてランタイム リンクを設定しました。

もう 1 つ補足として、Windows 32 ビットでも同様のことが起こります。Windows 64 では問題ありません。自分でコンパイルした libocilib.lib に対してプログラムをリンクして実行できます。

うまくいけば、私は十分な手がかりを提供しました...誰かが私が間違っていることを知っていますか?
事前に助けてくれてありがとう。

4

1 に答える 1

1

このようにリンクしてみましたか?

gcc -o test test.c -L. -locilib

少なくとも過去には (私は長い間 C/C++ をあまり使っていませんでした)、リンクの順序が重要でした。 の後に libocilib.aへのtest.o参照があり、それを使用して、それらは満たされます。しかし、これらの参照を逆にリンクした場合、リンカは参照する前にシンボルを見て、.OCI_Initializetest.oOCI_Initializetest.otest.o

于 2011-07-08T00:04:38.263 に答える