본문 바로가기
코스웨어/졸업생

[정보공유] 라이브러리 빌드에 관한글

by 알 수 없는 사용자 2015. 3. 27.
728x90
반응형

예전에 mac에서 작업할때 정리한 글입니다.


OSX, iOS의 경우 library에 standard, universal 이라는 개념이 있습니다.

standard의 경우 하나의 아키텍처에 대해서만 지원하고, (arm7, armv7, i386 ....)

universal은 여러가지 아키텍처를 지원하는 라이브러리 입니다.


요런것도 잇다 정도 알아두면 좋을듯 합니다.


아래 정리글은 boost, openssl을 사용하는 라이브러리를 mac, iphone 용으로 포팅하는 과정을 기술하였습니다.

ar, nm, lipo, strip 사용에 대해서도 알아두면 좋습니다.


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


static library

- 모든 오브젝트파일(.o)을 AR을 이용하여 묶어 준다. (.a 파일을 포함하면 안됨)

- 스태틱 라이브러리 포함이 필요한경우, object로 변경후 모두 다시 묶어준다.

- ar 명령은 정적 라이브러리를 생성, 조회, 편집하기 위한 명령어이다. (archive의 약자)


shared library

- shared 라이브러리는 .a파일을 포함할 수 있다.

- 컴파일러를 사용하여 만들어준다.


APPLE universal library 빌드

이번 라이브러리에는 open ssl과 boost가 포함되었다.

open ssl의 경우 필요한 부분만 추출하여 parcial 빌드하였으므로 바로 object파일 추출이 가능하였고,

boost의 경우 boost에서 제공되는 실행파일을 통하여 빌드되기 때문에 .a파일을

ar을 통하여 다시 오브젝트 파일로 만드는 작업이 필요하였다.


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


universal static library 


1. open ssl을 2가지 arch(i386, x86_64)로 컴파일하여 오브젝트 파일을 모아준다.


*현재 사용중인 맥북은 64비트이다.

$ gcc -fic -arch i386 -c (소스) - 32bit(i386)용으로 빌드

$ gcc -fic -c (소스)                - 64bit(x86_64)용으로 빌드


2. boost를 2가지 arch(i386, x86_64)로 빌드하여, 라이브러리 파일을 획득한다.


$ ./b2 -a --toolset=gcc-$MODE target-os=linux --user-config=configs/${MODE}/user-config.jam threadapi=pthread \

    --stagedir=${OUT_DIR}/${MODE}/x86_64 threading=multi link=static runtime-link=static\

    variant=$VARIANT\

    --with-filesystem\

    --with-system\

    --with-thread\

    --with-chrono\

    --with-iostreams\

    stage


$./b2 -a --toolset=gcc-$MODE target-os=linux --user-config=configs/${MODE}/user-config.jam threadapi=pthread \

    --stagedir=${OUT_DIR}/${MODE}/i386 address-model=32 threading=multi link=static runtime-link=static\

    variant=$VARIANT\

    --with-filesystem\

    --with-system\

    --with-thread\

    --with-chrono\

    --with-iostreams\

    stage


3. 획득한 boost 라이브러리를 ar의 x옵션을 이용하여, 오브젝트 파일로 만들고 모아준다.


*각 arch별 산출물 디렉토리에서 (i386, x86_64)

ar x libboost_thread.a

ar x libboost_system.a

ar x libboost_iostreams.a

ar x libboost_filesystem.a

ar x libboost_chrono.a

ar x libboost_atomic.a


4. 작성한 라이브러리 파일을 컴파일하여 오브젝트 파일로 만들어 준다. (아키텍처별로 각각)


CXXFLAGS= -g \

          -O2 \

          -fPIC \

          -Wall \

          -I$(BUILD_ROOT)/../../prebuilts/include -DSCS_SECURE -DMASI \

          $(MODULE_OS_DEVICE_DEFINES) \

          -fvisibility=hidden \

 $(MODULE_OS_DEVICE_DEFINES)


$ $(CXX) -o $@ -c $(CXXFLAGS) $<

$ mv $@ $(BUILD_ROOT)/x86_64

$ $CXX) -arch i386 -o $@ -c $(CXXFLAGS) $<

$ mv $@ $(BUILD_ROOT)/i38


5. ar crus 옵션을 이용하여 모든 오브젝트 파일을 각 i386, x86_64용 .a파일을 생성한다.


$ $(AR) crus $(BUILD_ROOT)/i386/$(STATIC_LIB_NAME) $(BUILD_ROOT)/i386/*.o

$ $(AR) crus $(BUILD_ROOT)/x86_64/$(STATIC_LIB_NAME) $(BUILD_ROOT)/x86_64/*.o


6. lipo를 통해 붙여준다.

$ $(LIPO) -output $(BUILD_ROOT)/$(STATIC_LIB_NAME) -create $(BUILD_ROOT)/i386/libscone.a $(BUILD_ROOT)/x86_64/libscone.a


7. stipr으로 불필요한 심볼을 지워 용량을 줄여준다.

$strip -S $(BUILD_ROOT)/$(STATIC_LIB_NAME)


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


universal shared library


1. open ssl을 2가지 arch(i386, x86_64)로 컴파일하여 오브젝트 파일을 AR을 이용하여 .a파일료 묶어준다


$ gcc -fic -arch i386 -c (소스) - 32bit(i386)용으로 빌드

$ gcc -fic -c (소스)                - 64bit(x86_64)용으로 빌드


$ ar rc $(OUT_DIR)/i386/$(LIB_NAME) $(OUT_DIR)/i386/*.o

$ ar rc $(OUT_DIR)/x86_64/$(LIB_NAME) $(OUT_DIR)/x86_64/*.o


2. boost를 2가지 arch(i386, x86_64)로 빌드하여, 라이브러리 파일을 획득한다.


* static 라이브러리 빌드와 동일하다 (단, AR을 이용하여 풀어줄 필요는 없다.)


3. 작성한 라이브러리를 앞서 컴파일한 라이브러리 파일과 함께 각 i386, x86_64빌드한다


CXXFLAGS= -g \

          -O2 \

          -fPIC \

          -Wall \

          -I$(BUILD_ROOT)/../../prebuilts/include -DSCS_SECURE -DMASI \

          $(MODULE_OS_DEVICE_DEFINES) \

          -fvisibility=hidden \

 $(MODULE_OS_DEVICE_DEFINES)


$ g++ $(SHARED_FLAGS) -arch i386 -o $(BUILD_ROOT)/i386/$(LIB_NAME) $(BUILD_ROOT)/i386/*.o $(BUILD_ROOT)/i386/*.a

$ g++ $(SHARED_FLAGS) -o $(BUILD_ROOT)/x86_64/$(LIB_NAME) $(BUILD_ROOT)/x86_64/*.o $(BUILD_ROOT)/x86_64/*.a


4. lipo를 통해 붙여준다.


$ $(LIPO) -output $(BUILD_ROOT)/$(STATIC_LIB_NAME) -create $(BUILD_ROOT)/i386/libscone.a $(BUILD_ROOT)/x86_64/libscone.a


5. stipr으로 불필요한 심볼을 지워 용량을 줄여준다.


$strip -S $(BUILD_ROOT)/$(STATIC_LIB_NAME)

728x90