2013-03-10 4 views
6

다른 라이브러리 ("bar"라고도 함)를 사용하는 공유 라이브러리 ("foo"라고 부름)를 구축 중입니다. "bar"는 OpenSSL의 일부 기능을 사용합니다.명확하게 존재하지 않는 미해결 OpenSSL 기호를 참조하는 오류가 있습니까?

여기가 문제의 원인입니다.

"bar"는 정적 라이브러리로 컴파일되었으며 OpenSSL도 마찬가지입니다. 나는 도서관 ("foo는")를 연결할 때, 나는 다음과 같습니다 : "foo는"

  • 정적 라이브러리에 대한

    • 오브젝트 파일을 libbar.a
    • OpenSSL이 정적 라이브러리 libcrypto.alibssl.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 기호를 나타내는 링커 오류가 발생하는 이유는 무엇입니까?

  • 답변

    3

    이 문제는 링크 명령에서 라이브러리 순서로 인해 발생했습니다.libcrypto.alibssl.a의 순서를 바꾸면 모든 기호가 해결됩니다.

    GCC는 기본적으로 LD 및 단일 패스 링커를 사용합니다. libssllibcrypto과 같은 두 개의 라이브러리가 특정 순서로 링크되어있는 경우 의 기호에 따라 libssl이 종속됨을 의미합니다. 따라서 libssllibcrypto 앞에 와야합니다 (또는 libcryptolibssl을 따라야 함). 놀랍지 않아야합니다. libssllibcrypto에 의존합니다. libcryptolibssl이 사용하는 암호를 제공하므로

    +1

    필자는 컴파일러/링커가 선형 순서로 기호를 학습하고 순서가 잘못된 조건이 발생하면 barfs가 발생하기 때문에 추측하고 있습니다. 그것은 심지어 역 선형 일 수 있습니다 (foo에 의존하는 예상 바 및 거꾸로 빌드 된 종속성 구성). – RobotHumans