2012-03-15 3 views
1

실행 파일을 만들 때 링크를 여러 개 포팅하는 프로그램이 있습니다. 독립 실행 형 툴체인을 사용하여 모든 라이브러리를 구축했으며 독립 실행 형 툴체인을 사용하여 안드로이드 장치에서 작동하는 실행 파일을 만들 수 있습니다. 그래서 제가 만든 라이브러리가 기능적으로 보이는 것 같습니다. 이제는 그 라이브러리를 앱과 통합하려고합니다. 그래서, 내 android.mk에서 나는 이런 식으로 뭔가가 :Android NDK로 미리 빌드 된 라이브러리를 사용할 때 빌드 문제

LOCAL_PATH := $(call my-dir) 
ROOT_PATH := $(LOCAL_PATH) 

include $(call all-subdir-makefiles) 
include $(CLEAR_VARS) 

LOCAL_PATH = $(ROOT_PATH) 

LOCAL_MODULE := test-libs 

LOCAL_STATIC_LIBRARIES := staticA 
LOCAL_SHARED_LIBRARIES := sharedA sharedB sharedC sharedD 
LOCAL_SRC_FILES := test-libs.c 

include $(BUILD_SHARED_LIBRARY) 

각 라이브러리를 들어, 나는 다음 이클립스 (내 프로젝트를 빌드 할 때이

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := sharedA 

LOCAL_SRC_FILES := sharedA.so 

include $(PREBUILT_SHARED_LIBRARY) 

같은 Android.mk이), 나는 이것을 얻는다 :

C:/ndk/android-ndk-r7b/toolchains/arm-linux-androideabi-4.4.3/prebuilt/windows/bin/../lib/gcc/arm-linux-androideabi/4.4.3/libgcc.a(unwind-arm.o): In function `__gnu_unwind_pr_common': 
/cygdrive/c/ndk/android-ndk-r7b/build/core/build-binary.mk:314: recipe for target `obj/local/armeabi/libtest-libs.so' failed 
/tmp/ndk-digit/src/build/../gcc/gcc-4.4.3/libgcc/../gcc/config/arm/unwind-arm.c:1237: undefined reference to `__cxa_call_unexpected' 

무엇이 잘못 되었습니까?

또한 정적 라이브러리와 공유 라이브러리 중 하나는 아무런 관련이 없으며 단지 포함 시키면 모두 멋지다. 내 공유 라이브러리 중 하나는 정적 라이브러리에만 의존했습니다. 그 중 하나만 포함하면 다른 공유 라이브러리에 종속 된 다른 라이브러리를 포함하면이 문제가 발생합니다.

업데이트 1 : Ok. 내 Application.mk의 APP_STL 설정이 무시 되었기 때문에 나타납니다. Application.mk에있는 내용은 다음과 같습니다. APP_STL : = gnustl_shared libgnustl_shared.so를 복사하고 다른 미리 만들어진 공유 라이브러리처럼 취급하면 문제가 사라집니다. APP_STL이 제대로 작동하지 않는 이유. 참고, 나는 뭔가를 망쳐 놓을 수 있었다. 방금 7b를 사용하도록 업그레이드했습니다. gnustl_shared를 사용하여 다른 앱에서 나와 함께 작업했습니다. 7로 롤백해도 문제가 해결되지 않습니다. 나는 이클립스에서 뭔가를 망쳤다 고 생각한다. 내가 sequoyah와 이클립스 (windows)를 사용합니다.

답변

1

링커에서 오류가 발생한 것 같습니다. 당신이해야 할 일은 다음과 같습니다 :

LOCAL_MODULE : = test-libs 아래에 LOCAL_LDLIBS를 추가하십시오. 여기서 미리 컴파일 된 라이브러리를 컴파일 할 때 링크 한 모든 라이브러리를 포함해야합니다. 그래서 예를 들면 :

LOCAL_LDLIBS := -lgnustl_shared -lgcc -llog -landroid -lstdc++ 

기본적으로 당신은 __cxa_call_unexpected 기능을 포함하고 어떤 라이브러리 식별해야합니다. 빠른 구글은 아마도 libstdC++에 있음을 보여줍니다. 사전 컴파일 된 라이브러리를 작성할 때이 라이브러리와 링크해야합니다.

+0

내 Application.mk APP_STL : = gnustl_shared에 -lgnustl_shared를 추가하면 LOCAL_LDLIBS에 찾을 수 없다는 메시지가 나타납니다. 사실 libs 디렉토리를 보면 gnustl_shared가 거기에 복사되지 않았습니다. 이것은 NDK 7b windows 설치를 사용하고 있습니다. 왜 그것을 뒤집어 쓰지 않는지에 대한 생각? NDK 7에 문제가있었습니다. 여전히 존재할 수도 있습니다. – corbin

+0

libgnustl_shared.so를 다소 수동으로 복사하면 다른 사전 빌드처럼 취급하여 모든 것이 잘되고 원래 문제점이 수정되어 문제가 해결되었다고 생각합니다. APP_STL 설정을 추가하는 것이 나에게이 일을하지 않는 이유는 무엇인지. 과거의 경험에 의하면 "있어야"합니다. – corbin

+1

나는 당신에게 동의한다, 그것이 정말로 있어야한다. 그리고 나는 그것이 모르는 이유를 모른다. 그것은 NDK의 버그와 같은 느낌입니다. 이와 같은 이상한 일들은 어느 곳에서나 모든 라이브러리에 연결됩니다 : P – Jake

1

예외 지원과 관련이 있다고 생각합니다.

코드에서 예외를 사용하고 있습니까? 그렇다면 예외를 지원하는 런타임 라이브러리로 컴파일 하시겠습니까? (및 예외와 함께 컴파일)?.

ndk docs의 CPLUSPLUS-SUPPORT 및 STANDALONE-TOOLCHAIN ​​파일에 더 많은 내용이 있습니다.

+0

감사합니다. gnustl_shared에 연결하지 않은 것과 관련이있는 것 같습니다. 다른 답변과 내 업데이트를 참조하십시오. – corbin

0

C 소스 파일 (* .c) 만 포함 된 프로젝트 중 하나가 C++ 파일 (* .cpp)을 포함하는 다른 프로젝트를 참조 할 때 비슷한 문제가 발생했습니다. 두 프로젝트의 Application.mk 파일에는 APP_STL : = gnustl_shared가 있습니다. ndk 버전은 ndk7e입니다.

해결 방법은 .c 파일 만 포함 된 프로젝트에 빈 C++ 파일 (dummy.cpp)을 추가하는 것입니다. 아마도 ndk는이 프로젝트가 gnustl_shared와 연결되어야하고 빌드가 성공한 것으로 이해했습니다.

관련 문제