log4cxx.dll 컴파일시 오류에 대하여 (Visual Studio 2010) 64비트 버젼 컴파일
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의 내용을 직접 해결해보자
- apr-util\include\apu.hw 파일을 열어서
- #define APU_HAVE_APR_ICONV 설정을 검색해서 값을 0으로 변경해서 저장한다.
- apr-util\include\apr_ldap.hw 파일도 열어서
- #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;
}