다른 라이브러리 ("bar"라고도 함)를 사용하는 공유 라이브러리 ("foo"라고 부름)를 구축 중입니다. "bar"는 OpenSSL의 일부 기능을 사용합니다.명확하게 존재하지 않는 미해결 OpenSSL 기호를 참조하는 오류가 있습니까?
여기가 문제의 원인입니다.
"bar"는 정적 라이브러리로 컴파일되었으며 OpenSSL도 마찬가지입니다. 나는 도서관 ("foo는")를 연결할 때, 나는 다음과 같습니다 : "foo는"
- 오브젝트 파일을
libbar.a
- OpenSSL이 정적 라이브러리
libcrypto.a
및libssl.a
빌드 명령은 다음과 같습니다.
g++ -Wl,-soname,libfoo.so -shared file1.o file2.o libbar.a \
libcrypto.a libssl.a -o libfoo.so
그러나, 다음 명령을 실행
ld: ./obj/libbar.a(file1.c.o): in function initialize_openssl:
ssl.c:117: error: undefined reference to 'SSL_library_init'
: 나는 오류의 톤을 얻을
nm libssl.a | grep SSL_library_init
다음과 같은 출력을 생성합니다 :
00000000 T SSL_library_init
그래서 분명히에는 OpenSSL 라이브러리와 아무 문제가 없다. 아마도 이런 일이 생길 수 있었을까요? 오류없이 완료 export cross=arm-linux-androideabi-
./Configure android --prefix=~/openssl-arm
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
컴파일 과정, 그래서 나는 완전히 당황 해요 : 여기에 OpenSSL을 구축하는 데 사용되는 세 가지 명령입니다.
명확하게 존재하는 많은 OpenSSL 기호를 나타내는 링커 오류가 발생하는 이유는 무엇입니까?
필자는 컴파일러/링커가 선형 순서로 기호를 학습하고 순서가 잘못된 조건이 발생하면 barfs가 발생하기 때문에 추측하고 있습니다. 그것은 심지어 역 선형 일 수 있습니다 (foo에 의존하는 예상 바 및 거꾸로 빌드 된 종속성 구성). – RobotHumans