>백엔드 개발 >Golang >CGO 애플리케이션에서 Oracle 라이브러리의 정적 링크 오류를 해결하는 방법은 무엇입니까?

CGO 애플리케이션에서 Oracle 라이브러리의 정적 링크 오류를 해결하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-20 22:01:13807검색

How to Resolve Static Linking Errors with Oracle Libraries in CGO Applications?

CGO 실행 파일에 대한 정적 Oracle 라이브러리 문제 해결

문제 개요:

CGO가 활성화되고 Oracle 라이브러리가 있는 Go 애플리케이션에서는 정적 링크 중에 오류가 발생합니다. 특히, GCC 링커는 필수 Oracle 라이브러리인 libclntsh를 찾을 수 없습니다. 컴파일 중에 라이브러리 경로를 지정했는데도 문제가 지속됩니다.

해결 방법:

문제를 해결하려면 다음 단계를 따르세요.

  1. Libclntst 라이브러리 생성: Oracle의 bin 디렉토리에 있는 genclntst 도구를 실행하여 libclntst의 정적 버전을 생성합니다: $ORACLE_HOME/bin/genclntst.
  2. 생성된 라이브러리 링크: 애플리케이션을 다시 컴파일하고 새로 생성된 libclntst 라이브러리와 연결합니다.
  3. 누락된 기호 식별: nm 도구를 사용하여 링커 오류를 분석하고 누락된 기호를 식별합니다.
  4. 나머지 기호 해결: 경우에 따라 누락된 기호를 해결하기 위해 추가 정적 라이브러리가 필요할 수 있습니다. 이전 Oracle 버전의 경우 ICC 런타임 라이브러리가 포함될 수 있습니다.

예:

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에 종속됩니다.

위 내용은 CGO 애플리케이션에서 Oracle 라이브러리의 정적 링크 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.