2017-03-23 4 views
0

제 3 자로부터 얻은 정적 라이브러리 (libexample.a)에 의존하는 라이브러리가 있습니다. 링크 단계에서 내 빌드가 실패했습니다. __aeabi_f2lz에 대한 불만은 정의되지 않았습니다. 정적 라이브러리를 검사했고 정의되지 않은 기호 __aeabi_f2lz가 있습니다. 링크하는 동안이 기호가 해결 될 것으로 기대됩니다. 내 라이브러리에 다음과 같은 코드를 추가하는 경우도__aeabi_f2lz는 어디에 구현 되었습니까?

:

volatile float fixme_float = 1.3f; 
volatile int64_t fixme_int64 = static_cast<int64_t>(fixme_float); 

링킹 오류가 사라집니다. 위의 코드는 __aeabi_f2lz를 강제로 사용하고 링크 오류를 신비하게 해결했다고 생각합니다. 나는 이것이 단지 연결 질서 문제 일 뿐이라고 생각한다.

누구에게 __aeabi_f2lz 구현이 포함되어 있는지 알고 있습니까? 정적 라이브러리를 연결 한 후 라이브러리에 종속성을 강제로 적용하여 문제를 해결할 수 있는지 확인하려고합니다. 아니면 주문을 연결했기 때문이라고 주장 할 권리가 있습니까? Android NDK의 독립 실행 형 팔 도구 체인을 사용하고 있습니다.

도움 주셔서 감사합니다.

업데이트 [1] : 빌드 명령은 다음과 같습니다

third_party/llvm-build/Release+Asserts/bin/clang++ -shared -Wl,--fatal-warnings \ 
    -fPIC -Wl,-z,noexecstack -Wl,-z,now -Wl,-z,relro -Wl,-z,defs -Wl,--as-needed \ 
    --gcc-toolchain=third_party/android_tools/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 \ 
    -fuse-ld=gold -Wl,--icf=all -Wl,--no-undefined -Wl,--exclude-libs=libgcc.a \ 
    -Wl,--exclude-libs=libc++_static.a -Wl,--exclude-libs=libvpx_assembly_arm.a \ 
    --target=arm-linux-androideabi -Werror -nostdlib \ 
    --sysroot=.third_party/android_tools/ndk/platforms/android-16/arch-arm \ 
    -Wl,-wrap,calloc -Wl,-wrap,free -Wl,-wrap,malloc -Wl,-wrap,memalign \ 
    -Wl,-wrap,posix_memalign -Wl,-wrap,pvalloc -Wl,-wrap,realloc -Wl,-wrap,valloc \ 
    -Lthird_party/android_tools/ndk/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a \ 
    -o "./lib.unstripped/libexample.so" -Wl,-soname="libexample.so" 
+0

실제로 해당 명령에 연결된 개체가 표시되지 않습니다. mylib은 정적 라이브러리 인'clang ++ -lgcc -lmylib'와 같은 것을 볼 것으로 기대하고 있습니다. 그렇다면 mylib가 링크되기 전에 libgcc가 검사되어 libgcc에서 물건을 가져 오지 않습니다. 또한 링크 명령에'-v'를 추가하여 clang이 전체 링커 명령 행을 알려주도록 할 수 있습니다.이 명령 행은 이러한 종류의 문제에 도움이 될 수 있습니다. –

답변

0

그것은 관하여 libgcc에 있어요 :

$ readelf -sW $NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/libgcc.a | grep __aeabi_f2lz 
    24: 00000000 56 FUNC GLOBAL DEFAULT 1 __aeabi_f2lz 

이는하지만 기본적으로 연결되어 있습니다. 연결 순서에 문제가있을 수 있습니다. 라이브러리를 링크하는 데 사용하는 명령을 포함하도록 답변을 업데이트 할 수 있습니까?

+0

나는 내 질문에 명령을 포함 시켰습니다. 우리는 골드 링커를 사용하고 libgcc.a는 명령 행에서 제외됩니다 : -Wl, - exclude-libs = libgcc.a 이것이 문제인지 확실하지 않은가요? – Aaron

+0

'--exclude-libs'는 실제로 그것들이 링크되는 것을 막지 않습니다. GLOBAL 대신 LOCAL을 사용하여 기호를 다시 내보낼 수 없도록 방지합니다 (예 : 플래그의 끔찍한 이름). 그것은 여전히 ​​일반적으로 당신이 libgcc로 원하는 것입니다. –