2016-08-05 12 views
3

私はすでに数日間検索していくつかの提案を試みましたが、役に立たなかった。現時点では、Oracle Databaseに接続する小さなGoスニペットを作成したいだけです。すべて正常にgo buildを使用して動作し、結果のダイナミックリンクされたアプリケーションを呼び出す、静的コンパイラを実行しようとすると私は立ち往生しています。私はすでに他のプロジェクトを静的に(CGOを使って)問題なく構築していますが、ここではgccはOracleライブラリを見つけることができません。多分誰かがヒントを持っていますか?ビルド中Linux/Ubuntuでoracleライブラリで実行可能な静的CGOを構築しようとしています

エラー:

host link: "gcc" "-m64" "-gdwarf-2" "-o" "/tmp/go-build319417544/command-line-arguments/_obj/exe/a.out" "-static" "/tmp/go-link-116023228/000000.o" "/tmp/go-link-116023228/000001.o" "/tmp/go-link-116023228/000002.o" "/tmp/go-link-116023228/go.o" "-g" "-O2" "-g" "-O2" "-lpthread" "-g" "-O2" "-L/usr/lib/oracle/12.1/client64/lib" "-lclntsh" "-static" 
/home/hannes/.gvm/gos/go1.5/pkg/tool/linux_amd64/link: running gcc failed: exit status 1 
/usr/bin/ld: cannot find -lclntsh 
collect2: error: ld returned 1 exit status 

ビルドコマンド

CGO_ENABLED=1 go build -work -x -ldflags " -v -linkmode external -extldflags -static" ${MAIN_SRC} 

アプリケーションコード:

package main 
/* 
// #cgo CFLAGS: -I/usr/lib/oracle/12.1/client64/include 
// #cgo LDFLAGS: -L/usr/lib/oracle/12.1/client64/lib -lclntsh 
*/ 
import "C" 
import (
    "fmt" 
    "database/sql" 
    _ "github.com/mattn/go-oci8" 
    "time" 
) 

func main(){ 


    db, err := sql.Open("oci8", "...") 
    ... 
} 

私は

dconfig -p | grep cln 
libkadm5clnt_mit.so.9 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libkadm5clnt_mit.so.9 
libclntshcore.so.12.1 (libc6,x86-64) => /usr/lib/oracle/12.1/client64/lib/libclntshcore.so.12.1 
libclntshcore.so (libc6,x86-64) => /usr/lib/oracle/12.1/client64/lib/libclntshcore.so 
libclntsh.so.12.1 (libc6,x86-64) => /usr/lib/oracle/12.1/client64/lib/libclntsh.so.12.1 
libclntsh.so (libc6,x86-64) => /usr/lib/oracle/12.1/client64/lib/libclntsh.so 
で確認しています

ダイナミックビルドの実行可能ファイルは(単に「oracle_test.go構築行く)それは必要なすべてを持っています

ldd oracle_test 
linux-vdso.so.1 => (0x00007ffeac867000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f083ef82000) 
libclntsh.so.12.1 => /usr/lib/oracle/12.1/client64/lib/libclntsh.so.12.1 (0x00007f083bfc5000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f083bbfa000) 
/lib64/ld-linux-x86-64.so.2 (0x00005615b32e8000) 
libmql1.so => /usr/lib/oracle/12.1/client64/lib/libmql1.so (0x00007f083b984000) 
libipc1.so => /usr/lib/oracle/12.1/client64/lib/libipc1.so (0x00007f083b606000) 
libnnz12.so => /usr/lib/oracle/12.1/client64/lib/libnnz12.so (0x00007f083aefb000) 
libons.so => /usr/lib/oracle/12.1/client64/lib/libons.so (0x00007f083acb6000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f083aab2000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f083a7a9000) 
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f083a58f000) 
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f083a387000) 
libaio.so.1 => /lib/x86_64-linux-gnu/libaio.so.1 (0x00007f083a184000) 
libclntshcore.so.12.1 => /usr/lib/oracle/12.1/client64/lib/libclntshcore.so.12.1 (0x00007f0839c12000) 

私はまた、/輸出CGO_LDFLAGSと助けにはならなかった/ ORDのLD_LIBRARY_PATH環境変数を、入れてみました。

PKG-config設定は、ライブラリ

pkg-config --libs oci8 
-L/usr/lib/oracle/12.1/client64/lib -lclntsh 

は、静的ライブラリを探していた後、私は完全なOracleデータベースのパッケージをインストールしているし、今私はlibフォルダ内のいくつかのより多くのファイル持っているだけでなく示しています ls /usr/lib/oracle/12.1/client64/lib/lib*.a
-rw-r--r-- 1 1424782 /usr/lib/oracle/12.1/client64/lib/libagent12.a -rw-r--r-- 1 1962088 /usr/lib/oracle/12.1/client64/lib/libasmclnt12.a -rw-r--r-- 1 2187864 /usr/lib/oracle/12.1/client64/lib/libasmclntsh12.a -rw-r--r-- 1 11386 /usr/lib/oracle/12.1/client64/lib/libasmperl12.a -rw-r--r-- 1 28454 /usr/lib/oracle/12.1/client64/lib/libavstub12.a -rw-r--r-- 1 7408322 /usr/lib/oracle/12.1/client64/lib/libcell12.a -rw-r--r-- 1 11246008 /usr/lib/oracle/12.1/client64/lib/libclient12.a -rw-r--r-- 1 0 /usr/lib/oracle/12.1/client64/lib/libclntst12.a -rw-r--r-- 1 1749282 /usr/lib/oracle/12.1/client64/lib/libclsr12.a -rw-r--r-- 1 10087032 /usr/lib/oracle/12.1/client64/lib/libcommon12.a -rw-r--r-- 1 5803698 /usr/lib/oracle/12.1/client64/lib/libcore12.a -rw-r--r-- 1 6051402 /usr/lib/oracle/12.1/client64/lib/libctx12.a -rw-r--r-- 1 1201840 /usr/lib/oracle/12.1/client64/lib/libctxc12.a -rw-r--r-- 1 56964 /usr/lib/oracle/12.1/client64/lib/libctxs12.a ...snipped...

1つのファイルのサイズがゼロだったので、$ ORACLE_HOME/bin/genclntstを実行してlibclntst12.aを生成しなければなりませんでした。

+0

'/ usr/lib/oracle/12の場合は表示されていません。1/client64/lib/'には、必要なすべての静的ライブラリが含まれています(またはシステムに依存性の静的なバージョンがありますが、その可能性があります)。 – JimB

+0

こんにちは、コンパイルに関する知識はあまりありません静的プログラム。 のglogin.sql libclntshcore.so libclntsh.so.12.1 libclntsh.so libclntshcore.so.12.1 libipc1 /usr/lib/oracle/12.1/client64/lib/ 'のLS:だから、ここに私のディレクトリがあります。そう てojdbc6.jar libsqlplusic.so libsqlplus.so liboramysql12.so libons.so libocijdbc12.so libociei.so libocci.so.12.1 libocci.so ojdbc7 libnnz12.so libmql1.so。 jur ottclasses.zip xstreams.jar ' – hanneslehmann

答えて

1
  • 静的ライブラリのためのlibclntst.a stスタンドという名前のライブラリーを生成するために使用$ ORACLE_HOME/binに/再リンクツール。 Oracleクライアントは通常、このファイルと一緒には出荷されません。 The
  • このライブラリとあなたのアプリをリンクさせてください。おそらく多くのシンボルが見つからないでしょう。
  • nmツールを使用して、見つからないシンボルのソースを見つけます。
  • は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 
    

静的リンクは手動ですべての依存関係を解決することが必要です。 この例では、libclntst11.aはlibippdcmerged.aおよびlibippsmerged.aのシンボルに依存します。

旧バージョンのOracleでは、データベース全体がビルドされ、IntelのICCコンパイラを使用してリンクされていました。したがって、Oracleのクライアントlibを静的にリンクするときには、ICCのランタイムからいくつかの静的ライブラリを追加する必要があります。

+0

こんにちは、お返事ありがとうございました。私は私のインストールで再リンクツールを持っていません(私はoracleが完全にインストールされていません)、インスタントクライアントパッケージのいくつかをダウンロードし、alien経由でubuntuにインストールしました(ここからの指示:[https:// help .ubuntu.com/community/Oracle%20Instant%20Client])。再リンクが他のパッケージの中にあるかどうかを後でチェックします。まだ解凍していない/インストールしていません。 – hanneslehmann

+0

こんにちは、私は(上のコメントを参照してください)私は "。私のフォルダには共有ファイルのみが含まれています。今、私は$ ORACLE_HOME/bin/relinkを追跡しています。これは、私がUbuntuコミュニティからのインストール手順では利用できないためです。ツールが ".a"ファイルを生成することを願っています。 – hanneslehmann

+0

こんにちは、私はOracleインストールをインストールし、再リンクツールを見つけました。ツールのログでリンカに関するエラーメッセージが表示されますので、静的ライブラリを取得するまでそれらを修正する必要があります。私は推測しています... – hanneslehmann

関連する問題