>  기사  >  백엔드 개발  >  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의 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으로 문의하세요.