首頁 >後端開發 >Golang >如何解決在 Linux/Ubuntu 上的 CGO 中連接到 Oracle 資料庫時的靜態連結錯誤?

如何解決在 Linux/Ubuntu 上的 CGO 中連接到 Oracle 資料庫時的靜態連結錯誤?

DDD
DDD原創
2024-11-21 14:19:14656瀏覽

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的relink工具:使用$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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn