마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

LOCAL_LDLIBS , LOCAL_SHARED_LIBRARIES 무슨 차이가 있는건가요?

0 추천
Android.mk  빌드관련 궁금한게 있는데요

LOCAL_LDLIBS , LOCAL_SHARED_LIBRARIES 무슨 차이가 있는건가요?

인터넷에서 예제를 찾아보면

 

LOCAL_LDLIBS +=  -llog

LOCAL_SHARED_LIBRARIES += libtest

이런식으로 사용하는것 같은데요

LDLIBS에서는 liblog.so에서 기존 리눅스 참조하듯이 -l 옵션으로 이름만 써주고

SHARED 에서는 libtest.so를 확장자 빼고 풀네임을 쓰는방식으로 검색하면 나오는데요

1)

LOCAL_LDLIBS , LOCAL_SHARED_LIBRARIES 무슨 차이가 있는건가요?

어떤기준을 갖고 둘중에 하나를 이용해서 사용해야 하는건가요?

 

2) 제가 libtest.so 파일을 만들어서 ndk 프로젝트에서 링크시켜주고 싶은데요

LOCAL_LDLIBS +=  -llog libtest.so

이렇게 하니깐 빌드 및 테스트했을때 정상동작을 하고 있습니다. -l 옵션을 붙여도 되고 안붙여도 되는건가요?

구글링 검색해보니 저와같은 고민으로 테스트를 했을때 libtest.so 풀네임으로 써주면 에러가 없어졌다는 내용이 많이 보이네요;

 

3)

LOCAL_LDLIBS +=  -llog

LOCAL_SHARED_LIBRARIES += libtest

2번 항에서 테스트한 옵션으로 3번처럼 바꿔서 하면 빌드에서 에러가 나는데요

에러내용은 libtest 의 함수를 찾을수 없다. 라이브러리 링크가 제대로 안된것 같은데

1번 질문처럼 두 옵션이 쓰이는 방법이 어떻게 다른것인지 궁금합니다.(1번질문과 겹치는 내용같네요)
oblab (1,490 포인트) 님이 2016년 5월 9일 질문

1개의 답변

+1 추천
 
채택된 답변
1) LOCAL_LDLIBS 는 주로 사전에 빌드된  외부 라이브러리를 사용할 때 사용하며,
LOCAL_SHARED_LIBRARIES는 빌드시 같이 컴파일되는 프로젝트에서 생성되는 라이브러리를 참조 할 때 사용합니다.
단지 결과적으론 NDK의 GCC 빌드시 커멘드로 입력되는 값인지라 가끔씩은 혼합해서 사용하기도 합니다.

예를 들어 설명드리면,

helloworld라는 프로젝트가 test라는 프로젝트를 참조하고 있는 상태에서
helloworld를 빌드를 시도하면 test라는 프로젝트를 먼저 컴파일하여 libtest.so부터 생성하고, libtest.so를 참조하여 helloworld 라이브러리가 생성되게 되는데, 이 경우, LOCAL_SHARED_LIBRARIES 쓴다고 생각 하시면 되며,
test같은 별도 빌드되는 프로젝트가 없는 상태에서 외부에 있는 라이브러리를 다이렉트로 참조한다면 LOCAL_LDLIBS를 사용한다고 생각하시면 됩니다.

2)Anrdoid.mk파일은 Makefile을 수정하기 편하게 만들어 둔 것일 뿐 궁극적으로 android ndk에 있는 GCC를 통해 빌드가 되며,
GCC 링크 옵션이 -l로 주거나 파일명을 주는것 모두 허용을 해서 빌드가 되는 것 입니다.
이 부분은 GCC를 공부 해보시라고 밖에 말씀을 드리기가 어렵네요.

3)1번의 답을 참조하세요
익명사용자 님이 2016년 5월 10일 답변
oblab님이 2016년 5월 10일 채택됨
...