2011. 3. 21. 13:24

oauth+openssl+curl 삼종 세트 VC에서 빌드(build)하기 (재배포팩 필요없이)


제목 처럼, oauth+openssl+curl 삼종 세트를 함께 빌드하는 방법을 공유합니다.
일단, oauth, openssl, curl 코드가 부분 수정된 것이 첨부파일에 포함되었는데,
해당 오픈소스 재배포에 대해 라이센스 위반이 있다면, 당장 첨부 파일을 삭제하도록 하겠습니다.
(본 블로그에 대해 CCL : 상업적 이용(Off), 컨텐츠 변경(Off) 입니다.)

일단, 기준 컴파일러는 VC9.0(Visual Studio 2008)이며,
빌드 & 링크 환경은 재배포팩 설치없는 버전으로 하였습니다.
그래서, 이와 같이 사용하는 경우, 바이너라 크기는 조금 커 질 수 있으나,
재배포팩 설치 Dependecy를 제거 했기 때문에, 배포가 좀더 용이해 질 것입니다.

즉, curl+openssl인 경우, 자체적인 dependency 때문에, 실행 경로등에 libeay32.dl과 같은 파일이
있어야만 동작하는 경우가 많습니다. 이런 암묵적인 dll 사용 대신, 정적 library로 링크하여,
단일 파일만으로 실행 가능토록하기 위한 빌드 방법을 공유합니다.
물론, VC9.0에서 빌드하여 자체적으로 발생하는 재배포팩 의존성 또한 제거합니다.

1) 다음과 같이 다운로드 & 압축 해제


curl : http://curl.haxx.se/download.html 의 Win32-MSVC 항목 다운로드
liboauth : http://liboauth.sourceforge.net/ 의 Download 항목 다운로드
openssl-1.0.0d : http://www.openssl.org/source/ 의 최신 항목 다운로드

2) openssl 빌드 준비
2011/03/10 - [Research/Etc] - OpenSSL VC9.0에서 빌드하기 참고

3) curl 빌드 준비
3-1) curl-7.21.4/lib/libcurl.vcproj 를 열면, libcurl.sln 파일이 생성된다.
3-2) 프로젝트 세팅->C/C++->Code Generation
에 Release는 Multi-Threaded (/MT)로, Debug는 Multi-Threaded DLL (/MD)로
설정한다.



3-3) curl-7.21.4/include/curl/curl.h를 다음과 같이 수정
...
#if defined(BUILDING_LIBCURL)
#define CURL_EXTERN 
#else
#define CURL_EXTERN 
#endif
#else
...

3-4) curl-7.21.4/include/curl/easy.h, memdebug.h를 다음과 같이 수정
CURL_EXTERN int (curl_strequal)(const char *s1, const char *s2);
==>
int (curl_strequal)(const char *s1, const char *s2);
와 같이 CURL_EXTERN 사용한 부분 삭제

4) liboauth 빌드 준비
4-1) liboauth-0.9.4/src/*.c -> *.cpp 로 rename
4-2) liboauth-0.9.4/src/oauth_http.cpp
#define OAUTH_USER_AGENT "liboauth-agent/" VERSION
==>
#define OAUTH_USER_AGENT "liboauth-agent/" LIBOAUTH_VERSION
로 수정
4-3) liboauth-0.9.4/src/xmalloc.cpp
char *xstrdup (const char *s) {
  void *ptr = xmalloc(strlen(s)+1);
  strcpy (ptr, s);
  return (char*) ptr;
}
==>
char *xstrdup (const char *s) {
  void *ptr = xmalloc(strlen(s)+1);
  strcpy ((char*)ptr, s);
  return (char*) ptr;
}
로 수정

5) 아래 경로에 build.depend.bat batch 파일 추가
@echo off
call "%VS90COMNTOOLS%vsvars32.bat"
echo *********************************
echo * Curl Build                    *
echo *********************************
devenv.com .\curl-7.21.4\lib\libcurl.sln /Build "Release|Win32"
echo *********************************
echo * OpenSSL Build                 *
echo *********************************
cd openssl-1.0.0d
call _build.static.bat
cd ..

아래 경로에 추가



6) build.depend.bat를 실행
위 batch 파일 실행후 아래 파일이 있는가?
./curl-7.21.4/lib/release/libcurl.lib
./openssl-1.0.0d/build.static/lib/libeay32.lib
./openssl-1.0.0d/build.static/lib/ssleay32.lib

7) 사용할 모듈 프로젝트에 위 경로를 다음과 같이 복사한다.


붉은색 box는 사용할 project 이름이며, depend라는 경로를 만든뒤, 1)과 5)에서 만든 경로를 복사한다.

8) 사용할 모듈 project의 프로젝트 세팅을 다음과 같이 수정한다.

8-1) C/C++->General->Additional Include Directories
를 아래 그림과 같이 추가한다.
depend/liboauth-0.9.4/src, depend/openssl-1.0.0d/inc32, depend/curl-7.21.4/include



8-2) C/C++->Preprocessor->HAVE_OPENSSL_HMAC_H, HAVE_CURL, CURL_STATICLIB 추가

8-3) C/C++->Code Generation->Runtime Library를 /MT(Release), /MTD(Debug)로 변경한다. (3-2 참고)
(만일, 배포시에 재배포팩이 설치되었다고 가정한다던지, 혹은 private assembly등을 이용한 경우,
8-3, 3-2 과정은 생략 가능하다.)

8-4) Linker->Additional Dependencies에 아래 항목을 추가한다.
libcurl.lib / ws2_32.lib / winmm.lib / wldap32.lib / libeay32.lib / ssleay32.lib

8-5) Linker->General->Additional Library Directory를 다음과 같이 추가한다.


depend/curl-7.21.4/lib/release, depend/openssl-1.0.0d/build.static/lib

9) 사용할 바이너리에 다음과 같이 파일을 추가한다.

즉, ./depend/liboauth-0.9.4/src에 있는 .cpp 파일을 통으로 가져옵니다.

10) liboauth를 사용한다.
# include "oauth.h"
...
VOID Test(VOID)
{
  oauth_sign_url2(...);
}

위와 같이 설정하고 빌드한 바이너리는 재배포팩 없이 독립적으로 실행되는 바이너리가 생성됩니다.
dependency walker등으로 확인해도 단일 바이너리만 있어도 됩니다. (물론, 8-3 과정을 수행한 경우)

11) 참고
위와 같은 경우 https://와 같은 HTTPS 프로토콜은 기본적으로 지원되지 않습니다.
만일 oauth에서 HTTPS를 사용하는 경우, libcurl 빌드 설정을 변경해야 합니다. (3) curl 빌드 준비 참고)
Additional include에 ..\..\openssl-1.0.0d\inc32가 추가되어야 하며,
Preprocessor에 ;USE_SSL;USE_OPENSSL;USE_SSLEAY를 추가하면 https를 지원하게 됩니다.