ホームページ >バックエンド開発 >Golang >Go アプリケーションを Oracle ライブラリに静的にリンクできないのはなぜですか?それを修正するにはどうすればよいですか?

Go アプリケーションを Oracle ライブラリに静的にリンクできないのはなぜですか?それを修正するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-26 19:53:15989ブラウズ

Why Can't I Statically Link My Go Application with Oracle Libraries, and How Can I Fix It?

静的ビルド中に Oracle ライブラリが見つかりません

Ubuntu で Oracle ライブラリを使用して静的 Go 実行可能ファイルを作成しようとすると、エラーが発生しましたそれらをリンクしようとしています。動的ビルドは成功しましたが、必要なファイルが正しい場所に存在しているにもかかわらず、静的コンパイラは Oracle ライブラリを見つけることができないと報告しました。

解決策

  1. 通常、Oracle クライアントにはこのファイルが同梱されていないため、$ORACLE_HOME/bin/relink ツールを使用して libclntst.a ライブラリを生成します。この静的ライブラリには、静的リンクに必要な欠落しているシンボルが含まれています。
  2. libclntst.a ライブラリを使用してアプリケーションをコンパイルします。未解決のシンボルが存在しないことを確認します。
  3. nm ツールを使用して、未解決の欠落シンボルのソースを特定します。
  4. 例として、Oracle 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

このコマンドには、依存関係を解決するための追加の静的ライブラリが含まれています。 libippdcmerged.a と libippsmerged.a が含まれます。

要約すると、静的リンクではすべての依存関係を手動で解決する必要があり、通常は動的リンクに含まれない追加のライブラリを含める必要がある場合があります。

以上がGo アプリケーションを Oracle ライブラリに静的にリンクできないのはなぜですか?それを修正するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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