C/C++

log4cxx.dll 컴파일시 오류에 대하여 (Visual Studio 2010) 64비트 버젼 컴파일

휘프노스 2018. 11. 19. 22:47

log4j (java) 와 log4net (csharp) 을 사용해보니 여러가지 편리함이 있어 이번엔 log4cxx를 사용해 보려고 했다.


아파치에서 제공하는 빌딩안내는


https://logging.apache.org/log4cxx/latest_stable/building/vstudio.html


이지만

비주얼 스튜디오 6.0 기준으로 만들어진 프로젝트

초장부터 뭔가 꼬여있다.


구글링으로 찾아낸


https://blog.lextudio.com/how-to-build-log4cxx-in-visual-studio-2010-a69d9bbd65d7


를 기반으로 해서 약간의 삽질이 있었지만 어렵지 않게 dll을 만들어낼수 있었다.


비주얼 스튜디오 2017을 사용할까도 했지만


최근 2017을 사용하며 접하는 버그들에 많이 짜증이난 상태라 위 블러그에 소개된 2010을 기준으로 컴파일해보았다.


-----


기본 패키지인


log4cxx.zip :  http://logging.apache.org/log4cxx/download.html

apr and apr-util : http://apr.apache.org/download.cgi   or   https://archive.apache.org/dist/apr/


에서 다운로드 하면 된다.


원래 사이트에 소개된 방법대로 진행하면 마지막 단계에서 오류가 발생한다.


기준 디렉토리는 log4cxx 상위 디렉토리에서 진행하면 된다.


unzip apr-1.2.11-win32-src.zip      -> manually extract this zip

rename apr-1.2.11 apr               -> rename the extracted folder

unzip apr-util-1.2.10-win32-src.zip -> manually extract this zip

rename apr-util-1.2.10 apr-util     -> rename this folder too

cd apache-log4cxx-0.10.0

configure                           -> execute configure.bat

configure-aprutil                   -> see below*



원인은 sed 가 설치되어있지 않아서이고 sed가 설치되어있다고 해도 다음단계에서 에러가 발생하게 되어있다.


configure-aprutil의 내용을 직접 해결해보자


  1. apr-util\include\apu.hw 파일을 열어서
  2. #define APU_HAVE_APR_ICONV 설정을 검색해서 값을 0으로 변경해서 저장한다.
  3. apr-util\include\apr_ldap.hw 파일도 열어서
  4. #define APR_HAS_LDAP 설정도 0으로 변경한 다음 저장한다.


여기까지 변경했으면 projects 폴더에서 log4cxx.dsw를 비주얼스튜디오 2010에서 읽어온다.

솔루션 전체가 읽히면서 비주얼스튜디오 6.0으로 되어있는 프로젝트파일들을 모두 알아서 2010으로 변환해준다.


솔루션이 로딩되면 apr, apr-util, log4cxx, xml  4개의 프로젝트가 보여야한다.


참조한 블로그에서는 컴파일 오류시 전처리 설정을 변경할 것을 말하고 있지만 나는 정상적으로 컴파일이 가능했기때문에 무시하겠다.


apr프로젝트 IP v6관련 수정

http://www.thalesians.com/finance/index.php/Knowledge_Base/CPP/log4cxx


컴파일을 하면 C2252 에러가 잔뜩 발생한다.

템플릿관련 버그인데 아파치 프로젝트에 공식 이슈 리포트가 있어서 이부분을 참조하면 된다.


https://issues.apache.org/jira/browse/LOGCXX-366


이 부분을 간단히설명하는 스택오버플로우도 있다.


https://stackoverflow.com/questions/18365538/c2252-error-when-building-log4cxx


내용은


"stringhelper.cpp" 소스코드 파일에


#include <iterator>을 추가하는 것과


"log4cxx.h" 안에 들어있는 탬플릿 정의인


LOG4CXX_LIST_DEF 함수에 대해


각각 아래의 두줄씩을 삭제하면 된다.


template class LOG4CXX_EXPORT std::allocator<T>; \

template class LOG4CXX_EXPORT std::vector<T>; \


extern template class LOG4CXX_EXPORT std::allocator<T>; \

extern template class LOG4CXX_EXPORT std::vector<T>; \



여기까지 하면 각각 프로젝트에 대해 정상적인 lib 파일이 생성된다.


마지막은 각 프로젝트에 지정된 폴더의 lib 파일들을

log4cxx 프로젝트 속성 -> 링크 -> 입력에서

아래의 사진처럼 입력해주면 됩니다.




이후에 컴파일하면 정상적인 log4cxx.dll을 얻을 수 있다.


원 출처 블로그에 생략된 부분이 있어서 찾아낸 조각들을 맞춰

전체 과정을 다시 정리해보았다.


-----


64비트용으로 컴파일하려고 할때 또 에러가 난다.

내용도 좀 황당한데

하여간 결론은

http://www.thalesians.com/finance/index.php/Knowledge_Base/CPP/log4cxx

에서 찾은 내용으로 해결이 됬다.


multicast.c에서 아래의 내용으로 수정하면 정상적으로 컴파일이 된다.


-#if MCAST_JOIN_SOURCE_GROUP

+#ifdef GROUP_FILTER_SIZE

     struct group_source_req mip;

     int ip_proto;

 #endif

 

     if (source != NULL) {

-#if MCAST_JOIN_SOURCE_GROUP

+#ifdef GROUP_FILTER_SIZE

         if (sock_is_ipv4(sock)) {

             ip_proto = IPPROTO_IP;

         }