2016-08-05 4 views
3

나는 이미 며칠 동안 검색했지만 몇 가지 제안을 시도했지만 도움이되지 않았습니다. 지금은 오라클 데이터베이스에 연결되는 작은 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 구축 가서)가 필요한 모든 것을 가지고 : 나는 또한/내보내기 CGO_LDFLAGS 및 도움이되지 않았다/ORD LD_LIBRARY_PATH 환경 변수를 넣어 시도

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) 

합니다.

는 PKG는-설정은

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

이 정적 라이브러리를 찾고 후, 설치 한 라이브러리를뿐만 아니라 전체 오라클 데이터베이스 패키지를 보여줍니다 지금은 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...

한 파일의 크기는 0이므로, $ 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/ '1! : 그래서, 여기 내 디렉토리입니다. 그래서 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. 병 ottclasses.zip xstreams.jar ' – hanneslehmann

답변

1
  • 사용 $ ORACLE_HOME/빈/다시 연결 도구는 정적 라이브러리에 대한 libclntst.a st 스탠드라는 이름의 라이브러리를 생성합니다. 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 컴파일러를 사용하여 빌드 및 링크되었습니다. 그래서 오라클의 클라이언트 lib를 정적으로 링크 할 때 ICC 런타임에서 정적 라이브러리를 추가해야했습니다.

+0

안녕하세요, 빠른 답변에 감사드립니다. 설치시 relink 도구가 필요하지 않습니다. (필자는 oracle을 완전히 설치하지 않았습니다.) 인스턴트 클라이언트 패키지를 다운로드하여 우분투에 설치했습니다. (여기의 지침 : [https : // help .ubuntu.com/community/Oracle % 20Instant % 20Client]). 재 링크가 아직 압축을 풀지 않았거나 설치하지 않은 다른 패키지 안에 있다면 나중에 검사 할 것입니다. – hanneslehmann

+0

안녕하세요, 그래서 (위의 주석 참조) ".a"정적 라이브러리가 없습니다. 내 폴더에 공유 파일 만 있습니다. 이제 우분투 커뮤니티에서 따라온 설치 절차를 통해 사용할 수 없으므로 $ ORACLE_HOME/bin/relink를 쫓고 있습니다. 도구가 ".a"파일을 생성하기를 바랍니다. – hanneslehmann

+0

안녕하십니까, 오라클 설치를 설치하고 다시 링크 도구를 찾았습니다. 도구의 로그에서 (다시) 링커에 관한 몇 가지 오류 메시지를 찾았으므로 정적 라이브러리를 얻을 때까지 수정해야합니다 ... – hanneslehmann

관련 문제