본문 바로가기

6. With IT/6.2 NDK

NDK_컴파일과정과 링크



a.h, b.h, c.h


a.cpp

b.cpp

c.cpp


LOCAL_SRC_FILES := \

    a.cpp \

    b.cpp \

    c.cpp \


# 각각 정적 라이브러리로 만들어줘야, 공유 라이브러리생성시, 가져다 쓸 수 있다.

include $(BUILD_STATIC_LIBRARY)

=> 이것들을 컴파일 하면 AlphabetLib.a (static library) 가 생긴다

============================================================================

============================================================================

one.h, two.h, three.h


one.cpp

two.cpp

three.cpp


LOCAL_SRC_FILES := \

    one.cpp \

    two.cpp  \

    three.cpp\


# 각각 정적 라이브러리로 만들어줘야, 공유 라이브러리생성시, 가져다 쓸 수 있다.

include $(BUILD_STATIC_LIBRARY)

=> 이것들을 컴파일 하면 NumberLib.a (static library) 가 생긴다

============================================================================

============================================================================



# 공유라이브러리 사용시 선언

include $(BUILD_SHARED_LIBRARY)




@@@.mk 파일에서 설정시, 각 cpp파일들을 한번씩만 컴파일 해 두면, 여러곳에서 사용할 수 있는 라이브러리가 생성된다.

LOCAL_SRC_FILES := \

    one.cpp \

    two.cpp \

    three.cpp\




==> 그러므로,  one.cpp 에서 a.cpp에 있는 함수를 사용하기 위해서 #include "a.cpp" 와 같은 행동은 함수의 multiple definition이 나올 수가 있게된다. 즉 #include "a.cpp"와 같은 행동은, a.cpp안에 있는 소스코드 내용을 그대로  one.cpp에 복사한 효과가 나타나기 때문에 링크 과정에서 당연히 multiple definition 에러가 나게된다.!!


결론 => 무조건 다른 곳에 있는 함수를 가져다 쓸 데에는 반드시 헤더파일만을 include하도록!!! (즉, 함수의 선언부분(definition만)만 정의해주어도, 컴파일러가 잘 알아먹는다.)



그리고 .h파일에는 웬만하면 함수의 프로토타입(Prototype)만을 정의해두고, 변수선언같은 것은 하지 말도록 하자!!