안드로이드 개발 질문/답변
(글 수 45,052)
라이브러리와 애플리케이션 간에 변수 참조 하는 부분에서, 기존 리눅스와 다른 에러가 발생해서 도움을 요청합니다.
main_var 는 애플리케이션의 main.c 에 글로벌 변수로 정의 되어 있으며,
shared 라이브러리에서 extern 로 참조 합니다.
기존 리눅스 환경에서는 이와 같은 구조의 사용이 문제가 되지 않았는데,
컴파일 시에 안드로이드에서는 undefined reference to `main_var' 에러가 발생합니다.
제가 테스트 한 코드를 보여 드리겠습니다.
//---------------------------------------
// library
//---------------------------------------
1) libtest.h
#ifndef _LIBTEST_
#define _LIBTEST_
extern int main_var; // 라이브러리 내에서 extern 로 참조되는 변수 선언
void func1();
#endif // _LIBTEST_
2) libtest.c
#include "libtest.h"
#include <stdio.h>
void func1()
{
main_var = 2; // 값의 설정
printf("func1 main_var=%d\n", main_var);
}
//---------------------------------------
// application
//---------------------------------------
3) main.c
#include "libtest.h"
#include <stdio.h>
int main_var = 0; // 실제로 여기서 글로벌 변수로 선언되었지요.
int main(int argc, char** argv)
{
main_var = 1;
printf("main main_var=%d\n", main_var);
func1();
printf("main main_var=%d\n", main_var);
return 0;
}
//---------------------------------------
// Android.mk
//---------------------------------------
LOCAL_PATH:= $(call my-dir)
# libtest
# ========================================================
include $(CLEAR_VARS)
LOCAL_SRC_FILES := \
libtest.c
LOCAL_MODULE:= libtest
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)
LOCAL_CFLAGS := \
LOCAL_SHARED_LIBRARIES :=
LOCAL_PRELINK_MODULE:=false
include $(BUILD_SHARED_LIBRARY)
# testlib
# ========================================================
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= main.c
LOCAL_C_INCLUDES := \
$(LOCAL_PATH)
LOCAL_SHARED_LIBRARIES := libtest
LOCAL_MODULE:= testlib
include $(BUILD_EXECUTABLE)
컴파일 시 undefined reference to `main_var' 에러가 발생합니다.
리눅스에서는 컴파일 잘 되면, 또한 제대로 동작 합니다.
out/target/product/generic/obj/SHARED_LIBRARIES/libtest_intermediates/libtest.o: In function `func1':
..external/cmx/lib_test/libtest.c:8: undefined reference to `main_var'
Android.mk 파일에 다음과 같이 설정하면 컴파일은 되지만, 실행시 링크 에러가 발생하네요.
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
open 소스를 포팅해야 하는데, 메인 프로그램과 모듈(so파일)의 관계가 모두 이런 구조로 동작하게 되어 있네요.
메인 프로그램에서 글로벌 변수를 가지고 있고, 모듈이 로딩되어 동작 하면서 변수를 참조하도록..--;
안드로이드에서는 이런 구조가 지원되지 않는지? 링커의 능력인것 같은데..