언제나 그렇듯이 세팅좀 하려면 항상 무시하는 CMAKE를 가지고 CURL을 안드로이드에 맞게 빌드해 봤다.
생각보다 괴랄할 것이므로 아래를 열기전에 마음을 가다듬도록 하자.
언제나 문제가 되는건 CMAKE_C_FLAGS 같은 플래그를 설정하면 CMAKE는 항상 먹어버린다는 것...
우선
NDK는 받아 두도록 한다.
여기서는 c:\Programs\android-ndk-r3에 설치 하였다.
그
리고 MingW를 C:\MingW에 Cygwin을 c:\cygwin에 설치 하였다.
MingW는
Mingw32-Make를 사용하기 위해, Cygwin은 cygwin1.dll을 위해 설치 하였다.
그럼 지금 부터
뻘짓을 시작하겠다.
우선 C_INCLUDE_PATH LD_LIBRARY_PATH등을 설정한다.
설정하는건
한번만 하고 끝날게 아니라 빌드 할때 마다 필요 하기 때문에 스크립트를 만들어 두자
작업환경이 윈도우라
cross.bat라는 파일을 만들었다.
set EABI_VERSION=4.2.1 set
GLIBC_ADDON_OPTIONS=crtbegin_dynamic.o set
GCC_ROOT_DIRECTORY=c:/Programs/android-ndk-r3/build/prebuilt/windows/arm-eabi-%EABI_VERSION% REM
set
path=%GCC_ROOT_DIRECTORY%/bin;%GCC_ROOT_DIRECTORY%/libexec/gcc/arm-eabi/%EABI_VERSION%;"C:\Program
Files\CMake 2.8\bin";"C:\cygwin\bin" set
path=%GCC_ROOT_DIRECTORY%/bin;%GCC_ROOT_DIRECTORY%/libexec/gcc/arm-eabi/%EABI_VERSION%;"C:\Program
Files\CMake 2.8\bin";C:/cygwin/bin set
GCC_ROOT_DIRECTORY=/cygdrive/c/Programs/android-ndk-r3/build/prebuilt/windows/arm-eabi-%EABI_VERSION% set
CPLUS_INCLUDE_PATH=%GCC_ROOT_DIRECTORY%/include:%GCC_ROOT_DIRECTORY%/lib/gcc/arm-eabi/%EABI_VERSION%/include:/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/include:%GCC_ROOT_DIRECTORY%/lib/gcc/arm-eabi/%EABI_VERSION%/install-tools/include:%GCC_ROOT_DIRECTORY%/lib/gcc/arm-eabi/%EABI_VERSION%/install-tools set
C_INCLUDE_PATH=%CPLUS_INCLUDE_PATH% set
TARGET_DIRECTORY=/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5 set
LD_LIBRARY_PATH=%GCC_ROOT_DIRECTORY%/lib:%GCC_ROOT_DIRECTORY%/lib/gcc/arm-eabi/%EABI_VERSION%/android:%TARGET_DIRECTORY%/arch-arm/usr/lib set
LDPATH=%LD_LIBRARY_PATH% rem -DHAVE_GLIBC_STRERROR_R=1 -D__EABI__ rem
-nostdlib
-Wl,-rpath-link=/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib
-L/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib
-lc
/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o set
LINK_FLAGS=-nostdlib
-Wl,-rpath-link=/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib
-L/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib
-lc set EXE_FLAGS=
/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o set
GCC_EXTRA_CONFIG=-nostdlib
-Wl,-rpath-link=%TARGET_DIRECTORY%/arch-arm/usr/lib
-L/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib
%TARGET_DIRECTORY%/arch-arm/usr/lib/crtbegin_static.o -lc
-DHAVE_GLIBC_STRERROR_R=1 -D__EABI__ set PREFIX=arm-eabi- set
GXX=%PREFIXg++.exe set GCC=%PREFIXgcc.exe set
ARM_BIN=C:\Programs\android-ndk-r3\build\prebuilt\windows\arm-eabi-%EABI_VERSION%\bin\ set
GCC_ROOT_DIRECTORY=/cygdrive/c/Programs/android-ndk-r3/build/prebuilt/windows/arm-eabi-%EABI_VERSION% set
flags=-DCMAKE_BUILD_TYPE="MinSizeRel" -G "MinGW Makefiles"
-DCMAKE_CXX_COMPILER="%ARM_BIN%%PREFIX%g++.exe"
-DCMAKE_C_COMPILER="%ARM_BIN%%PREFIX%gcc.exe"
-DCMAKE_AR="%ARM_BIN%%PREFIX%ar.exe"
-DCMAKE_LINKER="%ARM_BIN%%PREFIX%ld.exe" -DCMAKE_SYSTEM_NAME="linux"
-DCMAKE_C_FLAGS="%GCC_EXTRA_CONFIG%"
-DCMAKE_CXX_FLAGS="%GCC_EXTRA_CONFIG%" -DCURL_DISABLE_LDAP=TRUE
-DCURL_DISABLE_LDAPS=TRUE -DBUILD_CURL_TESTS=FALSE
-DCMAKE_EXE_LINKER_FLAGS="%LINK_FLAGS% %EXE_FLAGS%"
-DCMAKE_MODULE_LINKER_FLAGS="%LINK_FLAGS%"
-DCMAKE_SHARED_LINKER_FLAGS="%LINK_FLAGS%" mkdir cross cd cross cmake-gui
%flags% ..\ cd ..
:BUILD pause @echo off cd
cross
c:\mingw\bin\mingw32-make.exe pause |
실
제 빌드에 사용한 배치파일이다.
보면 CMAKE에 이런저런 플래그가 마구 들어가 있다. 하지만 제대로 적용이 안되고
직접 수동으로 설정해야할 목록이다 [...]
안드로이드에서 실행파일을 빌드 할때에는 그냥은 안되고
http://android-tricks.blogspot.com/2009/02/hello-world-c-program-on-using-android.html를
참고해서 해야한다.
문제는 CMake는 그 사실을 모른다는 거다. 따라서 지금부터가 삽질의 시작이다.
위
스크립트 대로라면 cmake-gui가 실행된다.
그러면 우선 configure를 버튼을 누른 후 Mingw
Makefiles를 선택 한다. 그리고 맨 아래쪽에 있는 Specify options for cross-compiling을
선택한다.

다음은
운영체제를 linux로 프로세서를 arm 그리고 각각 c, c++ 컴파일러를 설정한다. 그 다음 Target Root도 설치한
디렉토리에 따라 설정한다.

아마 에러가
한번 날꺼다 무시하자
그 다음 Configure를 한번 누른다. 에러가 안나면 좋겠지만 그런건 없다. 앞으로 몇번의
에러를 더 볼테니 그냥 넘어가자.
우선 지금 테스트 파일을 컴파일 하게 하기 위해 위 링크에서 봤던대로
CMAKE_C_FLAGS에 다음과 같이 넣어 준다. (Simple View에서는 안보인다)
| -nostdlib
-Wl,-rpath-link=/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib
-L/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib
-lc
/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o |
다
시 Configure를 눌러보자 그럼 이번엔 한단계 전진 할 수 있을 것이다. 뭔가 열심히 테스트 하기 시작한다 !!
그
럼 그 동안 몇개의 헤더를 수정해 보자.
우선 curl.h를 열고 다음을 적당히 앞쪽에 추가한다.
#if defined(__GNUC__) &&
defined(__EABI__) #include <sys/select.h> #endif |
그
리고 curlbuild.h를 열어서 __SYMBIAN__를 찾자 그럼 __EBAI__에 대한 정보가 있다. 이걸 __GNUC__에
다음과 같이 추가해야한다.
#elif
defined(__GNUC__) # if defined(__i386__) || defined(__ppc__) #
define CURL_SIZEOF_LONG 4 # define
CURL_TYPEOF_CURL_OFF_T long long # define
CURL_FORMAT_CURL_OFF_T "lld" # define CURL_FORMAT_CURL_OFF_TU
"llu" # define CURL_FORMAT_OFF_T "%lld" # define
CURL_SIZEOF_CURL_OFF_T 8 # define CURL_SUFFIX_CURL_OFF_T
LL # define CURL_SUFFIX_CURL_OFF_TU ULL # elif
defined(__x86_64__) || defined(__ppc64__) # define
CURL_SIZEOF_LONG 8 # define CURL_TYPEOF_CURL_OFF_T
long # define CURL_FORMAT_CURL_OFF_T "ld" # define
CURL_FORMAT_CURL_OFF_TU "lu" # define CURL_FORMAT_OFF_T
"%ld" # define CURL_SIZEOF_CURL_OFF_T 8 # define
CURL_SUFFIX_CURL_OFF_T L # define CURL_SUFFIX_CURL_OFF_TU
UL # elif defined(__EABI__) /* Treat all ARM compilers equally */ #
define CURL_SIZEOF_LONG 4 # define
CURL_TYPEOF_CURL_OFF_T long long # define
CURL_FORMAT_CURL_OFF_T "lld" # define CURL_FORMAT_CURL_OFF_TU
"llu" # define CURL_FORMAT_OFF_T "%lld" # define
CURL_SIZEOF_CURL_OFF_T 8 # define CURL_SUFFIX_CURL_OFF_T
LL # define CURL_SUFFIX_CURL_OFF_TU ULL # endif #
define CURL_TYPEOF_CURL_SOCKLEN_T socklen_t # define
CURL_SIZEOF_CURL_SOCKLEN_T 4 # define CURL_PULL_SYS_TYPES_H 1 #
define CURL_PULL_SYS_SOCKET_H 1
|
이대
로 빌드하면 strerror.c에서 에러가 난다. HAVE_GLIBC_STRERROR_R=1을 정의해 줘야한다.
아마 위 작업을 끝내도 send와 recv를 열심히 찾고 있을 것이다. 인내를 가지고
기다리자.
에러가 나면
BUILD_CURL_TEST -> FALSE
CURL_DISABLE_LDAP -> TRUE
CURL_DISABLE_LDAPS -> TRUE
CMAKE_C_FLAGS -> -D__GNUC__ -D__EABI__ -DHAVE_GLIBC_STRERROR_R=1
CMAKE_EXE_LINKER_FLAGS -> -nostdlib
-Wl,-rpath-link=/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib
-L/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib
-lc
/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib/crtbegin_dynamic.o
CMAKE_MODULE_LINKER_FLAGS , CMAKE_SHARED_LINKER_FLAGS -> -nostdlib
-Wl,-rpath-link=/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib
-L/cygdrive/c/Programs/android-ndk-r3/build/platforms/android-5/arch-arm/usr/lib
-lc
|
이제 Configure와 Generate가 잘 된다 빌드하자.
OTL CMake를 평소에 자주 쓰지만 특정 상황에 맞게 세팅 하는 건 역시 괴로운 일이다.
댓글을 달아 주세요
글 읽어보니 curl 안드로이드 용으로 컴파일 하신것 같은데요..
so 파일좀 보내주실수 있으신가요?
avata111@gmail.com
lua 포팅 하는 방법좀 가르쳐 주세요...jhoney510@yahoo.co.kr
저도 지금 stlport 포팅하려고 하는데 질문좀요 ~~~
프로요 버전의 소스코드를 다운받으면 external/ 폴더 아래에 stlport 라고 있는데 이 폴더를 몽땅 복사해서
stlport 가 포함되지 않은 버전에 추가 해넣고 빌드를 하는 방식으로 하고 있는데 잘안되네요ㅜ
안드로이드 소스코드에 직접 STLPort 라이브러리를 넣고 빌드를 해주는 방법을 아시나요???
제 메일은 clfgusxk@nate.com 입니다. 혹시 다른 방법이라도 stlport 포팅하는 방법을 알고 계시면 가르쳐 주세요~
안드로이드 lua 포팅방법좀 가르쳐 주십시오 ㅠ.ㅠ
미치겠습니다.
jungmin.jang@formalworks.com
글 올린거 보기 전에 crystax.net에서 수정된 ndk를 사용해서 문제를 해결했었네요. 답글 달아주신 거에 대해서는 감사드립니다.
잘 해결하셨었다니 다행입니다. :)
저는 안드로이드쪽 게임 포팅 쪽 일을 처음 맡아서 일하고 있습니다. 혹시 tinyxml을 안드로이드에서 사용하기 위해 컴파일 하실 때 컴파일 옵션은 어떻게 하셨는지 알 수 있을까요? 전 STL 사용하는 것으로 옵션 넣고 했는데 TiXmlDocument doc("xxx.xml"); 로 선언한 뒤 함수 빠져나올 때 프로그램이 죽어버리네요.
음 한동안 관리를 안하다 보니 못봤었군요 우선 ndk는 http://www.crystax.net/에서 공개하는 것을 사용 하였습니다. 파일을 읽어들이는 쪽에서 발생하는 문제인 걸로 봐서 locale 관련해서 stream 쪽에서 난 에러가 아닐까 싶습니다. 아마 ndk를 바꾸는 것으로 해결 될 수 있을 거라 생각합니다.