ホームページ  >  記事  >  バックエンド開発  >  Linux/Ubuntu 上の CGO で Oracle データベースに接続する際の静的リンク エラーを解決する方法

Linux/Ubuntu 上の CGO で Oracle データベースに接続する際の静的リンク エラーを解決する方法

DDD
DDDオリジナル
2024-11-21 14:19:14597ブラウズ

How to Resolve Static Linking Errors When Connecting to an Oracle Database in CGO on Linux/Ubuntu?

Linux/Ubuntu 上の CGO 実行可能ファイルでの Oracle ライブラリの静的リンクのトラブルシューティング

Oracle データベースに接続する静的バイナリを構築しようとしていますが、エラーが発生しましたリンクフェーズ中。問題の詳細な分析と解決策は次のとおりです:

リンク エラー

/usr/bin/ld: cannot find -lclntsh

このエラーは、コンパイラが Oracle ライブラリ libclntsh.a を見つけられないことを示します。

調査

構成には、ライブラリの動的バージョンがすでに含まれています動的リンクには (-L/usr/lib/oracle/12.1/client64/lib -lclntsh) を使用しますが、静的リンクには静的バージョン (.a) を使用する必要があります。

解決策

Oracle ライブラリを使用して静的 CGO 実行可能ファイルをビルドするには、次の手順に従う必要があります。手順:

  1. Oracle の再リンク ツールを使用します: $ORACLE_HOME/bin/relink ツールを使用して、libclntst.a という名前の静的ライブラリを生成します:

    $ORACLE_HOME/bin/relink all
  2. アプリをリンクするlibclntst.a: アプリケーションを静的ライブラリにリンクしてみてください:

    CGO_ENABLED=1  go build -work -x -ldflags  " -v -linkmode external -extldflags -static" -L/usr/lib/oracle/12.1/client64/lib  oracletest.go
  3. 欠落しているシンボルを特定します: さらにエラーが発生した場合は、nm ツールを使用して次のシンボルを見つけます欠落しているシンボルのソース。
  4. 欠落しているリンクライブラリ: 不足しているシンボルを提供するライブラリとリンクします。ほとんどの場合、追加の Oracle ライブラリ、または Oracle ライブラリが依存する他の C ライブラリの静的にコンパイルされたバージョンとリンクする必要があります。

例:コマンドは、静的にリンクされた実行可能ファイルを正常にビルドします。 11gR2:

/usr/bin/c++ -Wall -ggdb3 -fPIC \
 CMakeFiles/opassgen.dir/opassgen.cpp.o \
 CMakeFiles/opassgen.dir/dbutils.cpp.o \
 CMakeFiles/opassgen.dir/common.cpp.o  \
 CMakeFiles/opassgen.dir/crypto.cpp.o  \
 n.o  -o opassgen                      \
 -rdynamic -static-libgcc -L. -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic \
 /home/oracle/ivan/openssl-1.0.1t/libcrypto.a  \
 /oracle/u01/db/11.2.0.4/lib/libclntst11.a     \
 /oracle/u01/db/11.2.0.4/lib/libippdcmerged.a  \
 /oracle/u01/db/11.2.0.4/lib/libippsmerged.a   \
 -Wl,--whole-archive libtrotl.a -Wl,--no-whole-archive \
 -lpthread -ldl

結論

Oracle ライブラリを使用して静的にリンクされた CGO 実行可能ファイルを構築することは、複数のライブラリの依存関係により困難になる場合があります。提供されている解決策に従うことで、Oracle データベースに接続する静的バイナリを正常に生成できます。

以上がLinux/Ubuntu 上の CGO で Oracle データベースに接続する際の静的リンク エラーを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。