バージョン 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 に対してプログラムをリンクして実行できます。
うまくいけば、私は十分な手がかりを提供しました...誰かが私が間違っていることを知っていますか?
事前に助けてくれてありがとう。