본문 바로가기

4.개발 및 운영 환경

log4cxx 및 apr 설치 및 빌드 환경 구성

log4cxx은 apache 재단에서 만드는 공개 로그 프레임워크이다. c++에서 많이 사용되고 있으며 log4j와 거의 똑같은 기능을 제공하고 있다. 나름 많이 사용되고 있다.

그러나 이놈의 log4cxx가 윈도우에서 사용하기에는 쉽지 않다. log4cxx 0.10.x에서 이식성을 고려해서 apache의 apr을 사용하고 있는데, 이놈의 apr 빌드도 쉽지 않다. ㅡ.ㅡ;

그리고, 인터넷에서 log4cxx에 대해 다른 내용 대부분은 정적 라이브러리가 아닌 동적 라이브러리를 사용한 경우가 대부분이다. 그렇기에 여기서는 log4cxx을 정적 라이브러리 형태로 사용하는 방법과 이식성을 고려해 소스 빌드를 콘솔에서 스크립트로 수행하면서 가급적 소스 코드를 최대한 수정하지 않은 방향에서 접근하려고 한다.

이 것 때문에 하루 종일 고생했다. OTL

작성: http://ospace.tistory.com/,2011.07.20 (ospace114@empal.com)

log4cxx 설치하기

짧게 설명하면서 넘어가겠다. 그림은 생략~~ 그래서 다소 딱딱해서 보기 힘들지도..

log4cxx을 다운로드

log4cxx을 다운로드 받자. log4cxx를 위해 필요한 파일도 같이 다운로드 받자. 다운로드 받을 정보는 아래를 참고하기 바란다. 참고로 버전 정보도 명시했으니, 현재 사용려는 버전과 틀릴 경우 상이한 내용이 있을 수 있습니다.

다운로드 정보

꽤 많다. ㅡ.ㅡ;

혹시나 해서 말하는 건데, ant을 위해서 최소한 JRE가 설치되어 있다고 가정한다. ant를 사용하는 이유는 기존 visual studio용 프로젝트 파일은 버전에 따라서 변환 작업이 필요하게 된다. 이게 매끄럽지 못하다. 그래서 콘솔에서 수행할 수 있는 방법을 찾다보니 ant가 무난하다. maven 도 가능하지만 log4cxx에서는 maven이 ant을 호출하는 방식이라서 사용하지 않았다.

sed는 편집기인데, log4cxx에서 환경설정 실행할 때 필요하다. 리눅스인 경우 기본으로 설치되어 있으므로 생략해도 된다.

사실 apr-iconv는 필요 없는데 apr-util 빌드할 때 이를 강제로 체크하게 되어 있어서 일단 넣어놓았다. 어떻게 하면 없어도 되는지는 확인하지 못했다. 그리고 apr-iconv는 다운로드 페이지에서 바로 받을 수 없다.(2011년7월20일 기준) 아래 "Other files"라는 링크로 가서 받아야 한다. 파일면 뒤에 "r2"라는게 덧붙여 있다. 거참~

ant 설치

받은 ant을 적당한 디렉토리에 압축을 푼다. 그려면 서버 폴더에 bin이 있다. 이 디렉토리를 path에 걸어둔다. 혹시나 해서 lib 폴더도 CLASSPATH에 넣어준다. 그리고 ANT_HOME도 설정한다.

ANT_HOME=..(생략)..\apache-ant-1.8.0\
PATH = ..(생략)..;%ANT_HOME%\bin\;
CLASSPATH = ..(생략)..;%ANT_HOME%\lib\

다음에 cpptasks는 jar파일로 만들어서 ant의 lib 폴더에 복사해야 한다. 먼저 적당한 폴더에 cpptasks를 푼다. 혹시나 해서 ant 사용법을 모르실 것 같아서 친절하게 명령어를 아래와 같이 추가했다. ^^;

cpptasks-1.0b5>ant jars  
cpptasks-1.0b5>copy target\lib\cptasks.jar %ANT_HOME%\lib\

ant 관련 작업은 끝이다. 다음은 apr이다.

APR 설치

APR 설치는 조금 까다롭다. 조금 짜증이 난다. 여기서는 어쩔 수 없이 소스 코드를 수정해야 한다. 그렇다고 로직을 수정하는게 아니라 빌드 스크립트를 수정해야 한다. 자~ 그럼 시작해 보자.

apr관련해서 3가지가 있다. apr, apr-util, apr-iconv가 있다. 하나씩 보자.

apr을 적당한 위치는 압축을 푼다. 주의할 것은 윈도우즈는 윈도우용 소스 파일을 받아야한다. 별다른 것이 있는게 아니라 nmake용 빌드 시크립트가 들어 있기 때문이다. 리눅스용에는 없기에 주의가 필요하다. 근데 왜 그렇게 만들었을까? ㅡ.ㅡ;

앞축을 풀었으면 apr-1.4.5 폴더가 보인다. 뒤에 버전번호를 제거하여 apr로 변경한다. 필요시 include\apr.hw에 내용을 수정한다. 예를 들어 IPv6을 지원하고 싶다면, APR_HAVE_IPV6를 1로 수정한다.

이제 빌드를 해보자. 당연히 콘솔로... ^^;

혹시나 해서 말하는 것이지만 VC로 빌드하기 때문에 각 Visual Studio에서 Common7\Tools에 "vsvars32.bat" 를 실행해야 한다.

apr>"c:\\Program Files\\Microsoft Visual Studio 10.0\\Common7\\Tools\\vsvars32.bat"  
..(중략)..  
apr>nmake -f Makefile.win  
Microsoft (R) Program Maintenance Utility Version 10.00.30319.01  
Copyright (C) Microsoft Corporation.  All rights reserved.  

지정된 경로를 찾을 수 없습니다.  
ARCH        = Win32 Release  
PREFIX      = ..\\apr-dist  (install path)  
        "c:\\Program Files\\Microsoft Visual Studio 10.0\\VC\\BIN\\nmake.exe" -nologo -f apr.mak         CFG="apr - Win32 Release" RECURSE=0  
        if not exist ".\\LibR/" mkdir ".\\LibR"  
NMAKE : fatal error U1073: don't know how to make '"apr.h"'  
Stop.  
NMAKE : fatal error U1077: '"c:\\Program Files\\Microsoft Visual Studio 10.0\\VC\\BIN\\nma  
ke.exe"' : return code '0x2'  
Stop.

역시 문제가 발생했다.(물론 예상했지만 ^^;) 빌드 시크립트에서 의존관계가 일치하지 않는 문제가 발생한 것으로 보인다. nmake을 사용할 줄 모른다. 막막했지만 일단 한참을 보다보니 apr.mak에서 "include\apr.h" 생성에 문제가 있었다. 한참을 찾아 보니, {$(INCLUDE)}"apr.h"라는 곳에서 apr.h 생성을 담당하고 있었다. 어쩐일이지는 몰라도 "include\apr.h" 가{$(INCLUDE)}"apr.h"을 찾지 못해서 생성하지 못하는 듯 하다. 이것 저것 해보았지만, 무식하게 {$(INCLUDE)}"apr.h"를 "include\apr.h"으로 바꿔버렸다. 모두 76 곳에서 변경되었다. ㅡ.ㅡㅋ

그리고 libapr.mak에서도 같이 변경해줘야 한다. 77곳에 바뀌었다. ㅡ.ㅡㅋㅋ

그렇게 해서 다시 빌드하니 잘된다. 테스트까지 한다. 이런 패치버전을 만들어야 하나...

여하튼 arp에서 LibR에 apr-1.lib과 aprapp-1.lib가 생겼다. 여기서 우리가 필요한 것은 apr-1.lib이다.

다음은 apr-util이다. apr-util을 앞의 apr과 같은 폴더에 압축을 푼다. 그리고 뒤에 버전을 제거하여 폴더 명이 "apr-util"이 되도록 한다. 동시에 apr-iconv도 같은 폴더에 앞축을 풀고 폴더 명을 "apr-iconv"로 변경한다. apr-iconv은 거의 건들지는 않을 것이고, 형태만 갖출 뿐이다. ㅡ.ㅡ;;;;

추가로 설정 변경이 필요하다. include에서 apu.hw에서 APU_HAVE_APR_ICONV를 0으로 변경하고 apr_ldap.hw에서 APR_HAS_LDAP를 0으로 변경한다. 그냥 ICONV와 LDAP을 사용하지 않겠다는 의미이다. 사용하고 싶다면 1로 하면 된다. 상황에 따라... 여기서는 log4cxx을 위한 것이라서 빼도 무방하다.

이제 빌드를 해보자. 앞의 apr에서 이어서 한다고 가정한다.

apr-util>nmake -f Makefile.win  
...(중략)..  
        cd build  
        "c:\\Program Files\\Microsoft Visual Studio 10.0\\VC\\BIN\\nmake.exe" -nologo -f a  
pr\_app.mak    CFG="apr\_app - Win32 Release" RECURSE=0  
NMAKE : fatal error U1052: file 'apr\_app.mak' not found  
Stop.  
NMAKE : fatal error U1077: '"c:\\Program Files\\Microsoft Visual Studio 10.0\\VC\\BIN\\nma  
ke.exe"' : return code '0x2'  
Stop.

헉. apr-util에서도 에러가 발생. apr_app.mak을 빌드하는데 문제가 발생했다고 한다. 그래서 미친듯이 뒤졌다. 그렇다고 해서 무식하게 폴더에 들어가서 들어다 보지는 않았다. 가볍게 apr-util 폴더에서 검색해보았다. 없다.

혹시나 해서 apr 과 apr-iconv도 검색했다.

없다!!! OTL

정말 빌드할 때 이런 일을 만나면 정말 짜증나는 일이다. 무료이니 참아야지.

어떤 일인지는 몰라도 build 폴더에 apr_app.mak을 빌드해야하는데 없다. 그래서 Makefile.win에서 해당 빌드과정을 뺐다. 만약에 대비해서 주석처리해줬다. ㅋㅋㅋ

Makefile.win 파일

# cd build  
# $(MAKE) $(MAKEOPT) -f apr\_app.mak    CFG="apr\_app - $(ARCH)" RECURSE=0 $(CTARGET)  
# $(MAKE) $(MAKEOPT) -f libapr\_app.mak CFG="libapr\_app - $(ARCH)" RECURSE=0 $(CTARGET)  
# cd ..

빌드 잘된다. 스크롤 올라가는 걸 보면서 왠지 모르게 흥분이 된다. ^^; 테스트까지 한다.
테스트에서 실패가 뜨네.. 일단 무시~ 뒤끝이 좀 그렇네...
빌드가 되면 apr과 똑같이 LibR 폴더에 aprutil-1.lib파일이 생긴다.
필요하면 설치 과정을 통해서 include파일과 lib을 파일을 원하는 곳에 설치할 수도 있다. 이부분은 생략

이것으로서 기나긴 apr 설치를 마쳤다. 다음은 대망의 log4cxx이다.

log4cxx 설치

log4cxx 설치 전에 sed부터 설치하자. sed은 두 개 파일을 다운로드 받아야 한다. 하나는 sed 바이너리 파일, 하나는 sed을 실행하는데 필요한 dependency 파일이다. 본인은 설치버전이 아닌 압축버전을 받았다. 이 dependency 파일은 sed외에 다른 프로그램 실행할 때 사용하려는 목적이 있다. 만약 다른 gnu 프로그램이 있다면 해당 dependency파일이 이미 있을 것이다. 윈도우즈에서 dll 검색 방법에 의해 해당 dependency을 검색안될 수도 있으니 같은 폴더에 몰아 두면 된다. 이건 개인적인 취향이다.

그래서 sed.exe, libiconv2.dll, libintl2.dll, regex2.dll만 남겨두고 나머지는 빼버렷다. 물론 그냥 둬도 됀다. 이건 알아서 사용하시면 됩니다. 어찌됐든 설치되면 해당 프로그램 경로를 path에 넣어주자.

이제 log4cxx을 앞의 apr이 있는 같은 폴더에 앞축을 푼다. 그러면 폴더 구조가 다음과 같이 된다.

..(중략).. -+- apr\
|- apr-util\
|- apr-iconv\
`- apache-log4cxx-0.10.0\

이제 log4cxx 빌드할 모든 환경이 갖춰졌다. 한번 빌드해보자. 기본적으로 log4cxx 라이브러리는 static이라고 하자.
빌드는 릴리즈와 디버그로 나눌 수 있다. 아래는 릴리즈로 빌드하고 있다.
자세한 빌드 옵션을 보고 싶다면 "ant -p"와 "ant usage"을 참고하기 바란다.

apache-log4cxx-0.10.0>configure.bat  
apache-log4cxx-0.10.0>configure-aprutil.bat  
configure-aprutil.bat>ant -Dlib.type=static -Dapr.lib.type=static -Daprutil.lib.type=static -Denable-shared=no -Ddebug=false  
..(중략)..  
       [cc] stringhelper.cpp  
       [cc] e:\work\apr\apache-log4cxx-0.10.0_1\src\main\cpp\stringhelper.cpp(64) : error C2039: 'insert_iterator' : is not a member of 'std'  
       [cc] e:\work\apr\apache-log4cxx-0.10.0_1\src\main\cpp\stringhelper.cpp(64) : error C2065: 'insert_iterator' : undeclared identifier  
       [cc] e:\work\apr\apache-log4cxx-0.10.0_1\src\main\cpp\stringhelper.cpp(64) : error C2275: 'log4cxx::LogString' : illegal use of this type as an expression  
..(중략)..

다시 빌드 오류가 떴다. 이젠 지쳐간다. 다시 정식을 추스리고, 구글신께 물어보았다. 간청한 끝에 답을 얻었다.

해당 파일에 #include <iterator>을 추가하라는 한다. 설마~ log4cxx을 만드신 분이 이런 실수를...

std의 insert_iterator은 iterator헤더 파일이 필요한데, 리눅스 환경에서는 앞의 헤더파일 어디선가 iterator 헤더를 가져오기 때문에 에러가 없는데 윈도우즈는 그렇지 않은 모양이다. 그래서 #include <iterator>를 src\main\cpp 폴더에 있는 stringhelper.cpp에 추가해줬다.

..(중략)..
#include <cctype>
#include <apr.h>
#include <iterator>
..(중략)..

본의 아니게 소스코드를 수정해버렸다. 최악의 경우가 되버렸다. apache에 리포팅이나 할까?

다시 빌드해보자. 성공적으로 빌드를 마치고, 테스트 프로그램을 빌드하고 테스팅까지 한다.

테스트도 삑사리가 있다. 이건 각자 알아서 자세히 보시길... ㅡ.ㅡ;

여차저차해서 겨우 log4cxx 정적 라이브러리를 얻었다. "target\debug\static" 폴더에 가보면 log4cxx.lib과 testsuite.exe파일이 생겼다. 우리가 필요한 것은 log4cxx.lib파일이다.

디버그로로 빌드하고 싶다면;

ant -Dlib.type=static -Dapr.lib.type=static -Daprutil.lib.type=static -Denable-shared=no -Ddebug=true

를 사용하면 된다.

다 끝났을까?

마지막 산이 남아 있다. 뭐 다음이 필요 없으신 분은 통과해도 상관없지만..(?)
이젠 실제 프로그램에 log4cxx을 넣고 링크할 것이다. 굳이 여기까지 다루는 이유는 그냥 쓰기에 문제가 있기 때문이다.

log4cxx을 프로그램에서 넣기

log4cxx 라이브러리를 이용해서 logging을 해보자. 여기서는 log4cxx에 대한 사용 설명은 없다. log4cxx에 대한 설명은 구글신에게 물어보면 잘 알으켜주신다. 사용법에 대해 잘 정리해주신 분들이 많으니 찾아서 참고하시기 바란다.

메인 소스코드이다.

#include <log4cxx/logger.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/helpers/exception.h>
#include <log4cxx/ndc.h>
#include <log4cxx/mdc.h>

int main(int argc, char* argv[])
{
    log4cxx::LoggerPtr logger(log4cxx::Logger::getLogger("main"));
    log4cxx::PropertyConfigurator::configure("log.ini");

    LOG4CXX_TRACE(logger, "Trace message");
    LOG4CXX_DEBUG(logger, "Debug message");

    log4cxx::NDC::push("Test");
    log4cxx::MDC::put("ID", "start");

    LOG4CXX_INFO(logger, "Info message");

    log4cxx::NDC::pop();
    log4cxx::MDC::remove("ID");

    LOG4CXX_WARN(logger, "Warn message");
    LOG4CXX_ERROR(logger, "Error message");
    LOG4CXX_FATAL(logger, "Fatal error");
    LOG4CXX_ASSERT(logger, 1 == 2, "Assertion false");

    return 0;
}

log.ini파일이다.

# Set root logger level and its only appender to A1.
log4j.rootLogger=TRACE, A1

# A1 is set to be a ConsoleAppender.
log4j.appender.A1=org.apache.log4j.ConsoleAppender

# A1 uses PatternLayout.
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d [%5p:%t] (%c:%x) - %m%n

추가할 Include Directories는 다음과 같다.

  • apache-log4cxx-0.10.0\src\main\include

추가할 Library Directories는 다음과 같다.

  • apache-log4cxx-0.10.0\target\debug\static
  • apr\LibR
  • apr-util\LibR

위의 정보는 VC++ Directories에 추가한다. 참고로 VC 2010 이전에는 Tool>Options에서 있는는 이후에는 프로젝트 속성으로 이동했다.

그리고 추가해야할 라이브러리는 다음과 같다.

  • log4cxx.lib
  • apr-1.lib
  • aprutil-1.lib
  • ws2_32.lib
  • Mswsock.lib

대충 어떤 라이브러리인지 알 것이다. 해당 라이브러리도 하나씩 링크 오류를 보면서 찾아서 붙였다.

이제 설정이 끝났다. 그럼 빌드해 볼까? (물론 에러가 떨어질 것이다 ^^;)

..(중략)..  
3>test_log4cxx.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall log4cxx::helpers::ObjectPtrT<class log4cxx::Logger>::~ObjectPtrT<class log4cxx::Logger>(void)" (__imp_??1?$ObjectPtrT@VLogger@log4cxx@@@helpers@log4cxx@@UAE@XZ) referenced in function _main  
3>test_log4cxx.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static class log4cxx::helpers::ObjectPtrT<class log4cxx::Level> __cdecl log4cxx::Level::getFatal(void)" (__imp_?getFatal@Level@log4cxx@@SA?AV?$ObjectPtrT@VLevel@log4cxx@@@helpers@2@XZ) referenced in function _main
..(중략)..

분명 라이브러리도 정확히 걸어줬고, ObjectPtrT객체가 없나해서 log4cxx.lib를 뒤져보니 있다. 그래서 다시 미친듯이 구글신에게 물어봤다. 이것 저것 답을 주셨지만, 뚜렷한 해결책이 없었다.

컴파일 에러보다 더 어려운게 링크에러이다. 그래서 뭔가 없나 해서 이리저리 뒤졌지만, 시간만 허비했다.
그러던중 "__declspec(dllimport)"라는 메시지가 눈에 들어왔다. 갑자기 뭔가 번쩍하는게 있다. 즉 호출 방식이다.
그래서 헤더파일에서 "__declspec(dllimport)"을 찾아 보니 다음과 같은 코드가 보였다.

//  definitions used when using static library
#if defined(LOG4CXX_STATIC)
#define LOG4CXX_EXPORT
//   definitions used when building DLL
#elif defined(LOG4CXX)
#define LOG4CXX_EXPORT __declspec(dllexport)
#else
//    definitions used when using DLL
#define LOG4CXX_EXPORT __declspec(dllimport)
#endif

아마 이제 보이실 것이다. 즉, 사용할 라이브러리가 공유 라이브러리인 dll을 사용하도록 지정되어 있다. 내가 만든 것은 정적 라이브러리이다. 그러니 제대로 호출이 되지 않았다. LOG4CXX_STATIC 전처리기로 이를 제어할 수 있었다. 이는 다른 경우에도 마찬가지이다. 함수 호출 방식이 양쪽(헤더 파일과 라이브러리 파일)이 맞지 않는다면, 에러가 발생한다. 다행이 여기 링크에서 오류를 뿜어줬지만, 런타임에 발생한다면 깜깜하다.

이제 프로젝트 설정의 C/C++>Preprocessor에서 Preprocessor Definitions에 LOG4CXX_STATIC를 추가해주자.

그리고 다시 빌드해 보자.

다시 빌드 오류~ 빌드 오류 오류~

3>log4cxx.lib(level.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in test_log4cxx.obj

난생 처음 보는 에러다. OTL

_ITERATOR_DEBUG_LEVEL라는 건 뭐~~

그래서 구글 신에게.. 사족을 제거하고 결론을 말하면, _ITERATOR_DEBUG_LEVEL은 현재 라이브러리가 릴리즈용인지 디버그용인지을 판별하는 정보이다. 다시 말해서 현재 디버그 모드라면 _ITERATOR_DEBUG_LEVEL는 2로 되어 있어야 하지만 라이브러리는 0(릴리즈)으로 되어 있다는 것이다. 반대로 릴리즈인 라이브러리라면 _ITERATOR_DEBUG_LEVEL는 0이고 현재 빌드는 디버그(2)로 되어 있어도 틀리게 되어 에러가 발생한다.

그러면, 현재 디버그 모드이기 때문에 log4cxx 디버그용 정적 라이브러리를 만들면 된다. 이를 알면서도 앞에서 일부러 릴리즈를 만드는 센스~~ ㅡ.ㅡ;

이제 빌드를 해보자. 잘 된다.~~

실행하면 다름과 같은 결과가 나오면 된다.

main, 2011-07-20 16:30:08,618, test_log4cxx.cpp, test_log4cxx.cpp(17), 17, Trace message, TRACE, 19, 0x00001990 null, {}  
main, 2011-07-20 16:30:08,626, test_log4cxx.cpp, test_log4cxx.cpp(18), 18, Debug message, DEBUG, 27, 0x00001990 null, {}  
main, 2011-07-20 16:30:08,634, test_log4cxx.cpp, test_log4cxx.cpp(23), 23, Info message, INFO, 35, 0x00001990 Test, {{ID,start}}  
main, 2011-07-20 16:30:08,643, test_log4cxx.cpp, test_log4cxx.cpp(28), 28, Warn message, WARN, 44, 0x00001990 null, {}  
main, 2011-07-20 16:30:08,651, test_log4cxx.cpp, test_log4cxx.cpp(29), 29, Error message, ERROR, 52, 0x00001990 null, {}  
main, 2011-07-20 16:30:08,659, test_log4cxx.cpp, test_log4cxx.cpp(30), 30, Fatal error, FATAL, 60, 0x00001990 null, {}  
main, 2011-07-20 16:30:08,667, test_log4cxx.cpp, test_log4cxx.cpp(31), 31, Assertionfalse, ERROR, 68, 0x00001990 null, {}

Troubleshoot

Lare File System Error

에러메시지

.../include/apr-1/apr.h:358: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘apr_off_t’

혹 가다가 apr.h에 358줄의 "typedef off64_t apr_off_t;"에서 에러가 발생한다. 이는 대부분 32비트 플랫폼에서 빌드할때 발생하는데 large file system이 제대로 지원하지 않아서 발생한다. 보통 빌드 옵션에 -D_LARGEFILE64_SOURCE를 줄 수도 있지만, 이는 빌드 스크립트를 수정해야 하기에 apr에서 지원하는 기능을 사용하자.

configure을 실행할때 "--diable-lfs"을 넣어주면 된다. 그러면 빌드할때 에러는 발생하지 않는다.

결론

기나긴 log4cxx 설치 과정이 끝났다. 이를 좀더 응용하면, CI에 놓고 이식성이 높은 프로그램 작성이 유리할 것이다. 그리고, log4cxx, apr등이 업데이트되어도 빌드 파일 변경을 최소화하여 쉽게 업데이트도 가능할 것이다.

이렇게 어렵게 한 이유도, 이식성을 높이기 위해 소스를 그대로 가져다거 해당 플랫폼에서 필요할 때 생성하여 사용하기 위한 목적이 크다. 앞에서 적용한 내용은 빌드 스크립트 수정과 소스 파일 1개 수정이다. 별도로 파일 추가나 제거는 없었다. 윈도우도 Visual Studio 종류에 상관없이 빌드가능하게 되었다. 별도로 프로젝트 열어서 IDE를 통해서 변환하고 빌드하는 작업이 제거된 것이다.

그리고 현재 정적으로 빌드했지만, 필요하면 동적으로도 빌드할 수 있다. 이는 프로젝트 환경에 따라 가변적으로 적용하면 될 것이다. 앞의 과정에서는 별도 설치과정이 없지만, 라이브러리와 헤더 파일을 따로 모아 놓는 곳이 있다면 해당 위치로 설치하는 과정을 추가하면 된다.

위의 문제점을 해결하는데 하루종을 걸렸지만, 이 내용을 정리하는 데에도 3시간 정도 걸렸다. 시간이 많이 걸린 것이 본인도 다시 처음 부터 설치하고 빌드하는 과정을 반복하면서 확인했기 때문이다.

이 글이 여러분에 도움이 되었으면 하는 바램이다. ospace114@empal.com

반응형