iPhone 용 LibgCrypt 크로스 컴파일? 링커 오류… "fwrite"와 "strerror"를 찾을 수없는 것 같습니다.

StackOverflow https://stackoverflow.com/questions/1620375

문제

나는 성공적으로있다 iPhone의 APR (Apache Portable Runtime)을 크로스 컴파일했습니다., 세트를 사용합니다 스크립트를 구성합니다 필요한 교차 컴파일 옵션으로 GNU Autotools "./configure"를 호출합니다.

나는 현재 libtasn1과 libgcrypt에 의존하는 gnutls를 크로스 컴파일하려고 시도하고 있으며, 이는 Libgpg-error에 달려 있습니다. 이곳은 내가 곤경에 빠지고 당신의 도움을 사용할 수있는 곳입니다 ...

나는 현재 libgpg-error를 교차 컴파일하려고합니다. 이전에 사용한 스크립트 구성은 아름답게 작동합니다. "./configure"프로세스는 깨끗하게 완료됩니다. 내가 "make"를 실행할 때 문제가 발생합니다. 내가 만들 때, 모든 것이 컴파일되는 것처럼 보이지만 마지막에 불쾌한 링커 오류가 발생합니다.

/bin/sh ../libtool --tag=CC   --mode=link /Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2  -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include  -arch armv6 --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o  ./libgpg-error.la  
/Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include -arch armv6 --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o  -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib ./.libs/libgpg-error.a
Undefined symbols:
  "_fwrite$UNIX2003", referenced from:
      _main in gpg_error-gpg-error.o
  "_strerror$UNIX2003", referenced from:
      _gpg_strerror in libgpg-error.a(libgpg_error_la-strerror.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[3]: *** [gpg-error] Error 1
make[2]: *** [all] Error 2
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

이것을 작동시키는 방법에 대한 아이디어가 있습니까? 내가 컴파일하는 소프트웨어의 버전은 다음과 같습니다.

  • libgpg-error : 1.7
  • libgcrypt : 1.4.4
  • libtasn1 : 2.2
  • Gnutls : 2.8.4

도와주세요. 고맙습니다.

업데이트

초기 피드백에 따라 각 SDK에는 "$ sdkroot/usr/lib"에 "libsystem.dylib"사본이 있습니다. "$ devroot/usr/lib"에는 libsystem 사본이 없습니다.

  • $ devroot = "/developer/platforms/iphoneos.platform/developer"
  • $ sdkroot = "$ devRoot/sdks/iPhoneOS $ ver.sdk"

"libsystem"라이브러리에는 각 기호의 일반적이고 미색되지 않은 버전이 포함되어 있지만 기호의 "$ unix2003"변형은 포함되어 있지 않습니다. gpg-error가 "_posix_c_source", "_unix"또는 다른 UNIX 기능 테스트 매크로를 정의하고 있으며 이러한 기능 테스트 매크로가 존재할 때 "$ UNIX2003"을 기능에 부가하는 도적 헤더가 정의되고 있다고 생각합니다. 포함 된 디렉토리 목록에서 "$ devroot/usr/포함"제거는이 오류 메시지를 제거하는 것과 관련하여 영향을 미치지 않습니다.

최후의 수단으로서, "ld"는 "_fwrite _fwrite $ unix2003"과 같은 항목이있는 파일을 지정하여 이러한 정의되지 않은 기호를 설명되지 않은 변형으로 해결할 수있는 "-alias_list"옵션을 허용합니다. 가능하다면이 옵션을 피하고 싶습니다.이 옵션은 해킹되고 잠재적으로 위험 해 보이기 때문입니다.

도움이 되었습니까?

해결책

일반적으로 해결되지 않은 기호 $ UNIX2003 당신이 의미합니다 기존 객체 파일이 구축 된 것보다 이전 SDK와 연결.

한 가지 이상한 모습은 나에게 Path를 포함하고 있으며, 나는 Mac Developement에 모호하게 익숙하고 iPhone 개발에 전혀가 아니라 경로입니다.

/Developer/Platforms/iPhoneOS.platform/Developer/usr/include

실제로는 SDK 폴더에 없습니다. 도적 기호를 집어 올렸을 때, 그곳에서 그곳에서 그것을 집어 들었을 가능성이 있습니까? SDK가 경로를 포함하는 것보다 명령 줄에서 나중에 발생하기 때문에 가능성이 낮은 것 같습니다.

아마도 기호는 예상 버전 일 것입니다 _fwrite 그리고 _strerror 그래서 gpg_error-gpg-error.o 그리고 libgpg-error.a 괜찮고 다시는 링크 문제이지만 다시는 링크 문제입니다.

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib

-L 옵션으로. 어딘가에 Libsystem Dylib가 있다고 가정하고 있습니까?

가장 먼저해야 할 일은 기호의 UNIX2003 버전이 당신이 기대하는지 여부를 확인하는 것입니다. 내 생각은, 그것이 내가 말한 것처럼 내가 완전히 잘못 될 수 있습니다. :)

둘째, 당신은 장황한 출력을 시도 할 수 있습니다 ld 상징을 찾는 위치를 보려면. 이런 일을하도록 설정할 수있는 환경 변수가 있다고 확신하지만 온라인 맨 페이지에 나열된 어떤 것도 볼 수 없습니다. ld. (업데이트: 두 ENV 변수는입니다 LD_TRACE_ARCHIVES 그리고 LD_TRACE_DYLIBS 그러나 아마도 그들은 -t?와 동일하게 줄 것입니다.).

편집하다:

좋아, 그래서 나는 UNIX2003 기호에 대해 완전히 틀렸다. ㅋㅋㅋ.

libgpg-error를 만들 때 파일을 만들 것이라고 생각합니다.

src/.deps/gpg_error-gpg-error.po

여기에는 헤더 종속성이 포함되어 있습니다 (적어도 Linux 시스템에서 수행). 이것은 gpg_error-gpg-error.o를 구축 할 때 잘못된 헤더를 어디에서 얻었는지에 대한 단서를 줄 수 있습니다.

btw, libgpg-error를 구성하는 스크립트가 두 사람을 받아 들인 것처럼 보입니다. -isysroot 그리고 -arch옵션. 구성 스크립트의 자신의 버전 대신 사용할 수 없습니까?

edit2 :

좋아, 또 다른 가자 :) 여기에 깨끗한 소스 폴더에서 시작하여 시도해 볼 몇 가지가 있습니다.

  • -sysroot 대신 -isysroot를 사용하십시오
  • -ISYSROOT 및 -SYSROOT를 사용하십시오
  • 예를 들어 폴더의 이름을 바꾸어 일반 시스템 헤더를 사용할 수 없게 만듭니다. 바라건대 빌드가 헤더를 찾지 못하고 정확히 어디에 있는지 알려줄 것입니다.

다른 팁

-E를 사용하여 GPG_ERROR-gpg-error.c를 전제로 사용하여 누락 된 기호를 검색하십시오. ASM ( "_" "nice" "@unix2003")과 같은 위치에서 찾아야합니다. 그런 다음이 헤더를 수정하십시오 (예 : #Warning "HERE"를 추가하려면 Unistd.h). 포함 된 스택을 찾아야합니다.

2003 달러의 접미사는 컴파운드 수동 입력에서 완전히 문서화 할 수있는 일부 상황에서 컴파일러에 의해 생성됩니다.

man compat

나는 설정하여 마침내 고치기 전에 얼마 동안 이것과 씨름했다.

-mmacosx-version-min=10.3

10.4 이전 버전은 작업을 수행합니다. LD의 -t 옵션을 사용하여 잘못 연결된 라이브러리를 검색하는 것이 더 나을 수 있습니다.

도움이 되었기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top