bccでlog4cxxをコンパイル

ふと思い立って、log4cxxを使ってみる気になったのでbccコンパイルしたときの手順を残そうかと。



http://logging.apache.org/log4cxx/building/ant.html
ここの「Building Apache log4cxx with Apache Ant」と「Quick start」を見ながら作業してみた。

どうやらApache Antとcpptasksがコンパイルに必要らしい。
あと、log4cxxが使うライブラリとしてARPAPR-Utilが必要らしい。

このあたり、Quick startの英文を読まずにコマンドだけ打とうとしたら盛大にはまった…


使ったバージョンとファイルは以下のとおり。

  • apache-ant-1.7.1-bin.zip
  • apache-log4cxx-0.10.0.zip
  • apr-1.3.8-win32-src.zip
  • apr-util-1.3.9-win32-src.zip
  • cpptasks-1.0b5.zip


とりあえずコンパイルはこんな感じ。

  • パスの設定

自分はAntをc:\workに解凍して作業。JDKはc:\soft。

set PATH=%PATH%;c:\work\apache-ant-1.7.1\bin
set JAVA_HOME=c:\soft\Java\jdk1.6.0_16

ちなみにJREを使おうとしたら

BUILD FAILED
C:\work\cpptasks-1.0b5\build.xml:138: Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK.
It is currently set to "c:\Program Files\Java\jre1.5.0"

こんな感じで怒られた…

(同じくc:\workに解凍済み)

C:\work\cpptasks-1.0b5>ant

コンパイルしたcpptasksをAntのライブラリディレクトリにコピー

copy /b C:\work\cpptasks-1.0b5\target\lib\cpptasks.jar C:\work\apache-ant-1.7.1\lib\

コンパイルしたcpptasksをどうしたら良いかわからなかったけど、http://ant-contrib.sourceforge.net/の「Installation」あたりに"ant-contrib-0.3.jar"と"/usr/share/java/lib/"ってキーワードが見えたから適当にコピーしてみたら動いた。

  • log4cxxを解凍

ARPARP-utilを解凍してディレクトリ名をaprapr-utilに変更
(c:\libに解凍した)
この3つは同一ディレクトリにおいておけば良いっぽい。

c:\lib\apr
c:\lib\apr-util
c:\lib\apache-log4cxx-0.10.0
C:\lib\apache-log4cxx-0.10.0>ant -Dcompiler=bcc -Dfind=false build

ここで、bccのお約束。コンパイルエラーの嵐が発生(^^:
いつもどおりなので気にせずソースコードの修正作業に。
*1

[cc] エラー E2141 C:\soft\Borland\BDS\4.0\Include\ws2tcpip.h 205: 宣言の構文エラー
[cc] エラー E2139 C:\soft\Borland\BDS\4.0\Include\ws2tcpip.h 370: 宣言に ; がない
[cc] エラー E2238 C:\soft\Borland\BDS\4.0\Include\ws2tcpip.h 371: 'sockaddr_gen' の宣言が複数見つかった
[cc] エラー E2344 C:\soft\Borland\BDS\4.0\Include\ws2tcpip.h 370: 一つ前の 'sockaddr_gen' の定義位置
[cc] エラー E2139 C:\soft\Borland\BDS\4.0\Include\ws2tcpip.h 371: 宣言に ; がない
[cc] エラー E2238 C:\soft\Borland\BDS\4.0\Include\ws2tcpip.h 372: 'sockaddr_gen' の宣言が複数見つかった
[cc] エラー E2344 C:\soft\Borland\BDS\4.0\Include\ws2tcpip.h 370: 一つ前の 'sockaddr_gen' の定義位置
[cc] エラー E2139 C:\soft\Borland\BDS\4.0\Include\ws2tcpip.h 372: 宣言に ; がない
[cc] エラー E2141 C:\soft\Borland\BDS\4.0\Include\ws2tcpip.h 683: 宣言の構文エラー

いきなりのっけからラスボスに遭遇…
単独でwindows.hとws2tcpip.hをincludeしたファイルは正常にコンパイルできるし、意味不明…
いろいろ試した結論としては、APRに関してはbcc 5.5.1でコンパイルしてlog4cxx本体はbcc 5.8でコンパイルするのが正解っぽい。
具体的なやり方は

  1. 以下のソースコード類の修正を入れる
  2. bcc 5.5.1でいったんコンパイルする (なぞのエラーでコンパイルが停止するが、ARPARP-Utilはコンパイル済み)
  3. C:\lib\apache-log4cxx-0.10.0\target\debug\sharedディレクトリの中身を削除する (log4cxxも最後のほうまでコンパイルできているのでいったん削除)
  4. bcc 5.8でコンパイルする (これでlog4cxx本体はbcc 5.8でコンパイルされる)

※:引用部分は修正前に表示されるエラー

C:\lib\apr-util\include\apu.h
L:127 以下を追加
#if defined(__BORLANDC__)
#define HAVE_SQL_H
#endif

C:\lib\apr-util\dbd\apr_dbd_odbc.c
宣言の構文エラー

sql.hなどのincludeにHAVE_SQL_Hが必要

C:\lib\apache-log4cxx-0.10.0\build.xml
L:549 <!-- 追加
L:553 --> 追加

C:\lib\apache-log4cxx-0.10.0\build.xml:548: brc32 failed with return code -1073741819

Windowsならコンパイラをリソースコンパイラに変更する部分をコメントアウト


ここからは基本的にstd::の指定忘れと適切なincludeが入っていないのが原因。

C:\lib\apache-log4cxx-0.10.0\src\main\cpp\exception.cpp
L:28 using namespace std; 追加

未定義の関数 'memcpy' を呼び出した(関数 Exception::Exception(const std::wstring &) )

C:\lib\apache-log4cxx-0.10.0\src\main\cpp\inputstreamreader.cpp
L:66 std:: 追加

未定義の関数 'memmove' を呼び出した(関数 InputStreamReader::read(Pool &) )

C:\lib\apache-log4cxx-0.10.0\src\main\cpp\stringhelper.cpp
L:32 #include  追加

'insert_iterator' は 'std' のメンバーではない(関数 StringHelper::toLowerCase(const std::wstring &) )

C:\lib\apache-log4cxx-0.10.0\src\main\cpp\socketoutputstream.cpp
L:52 std:: 追加

未定義の関数 'memcpy' を呼び出した(関数 SocketOutputStream::write(ByteBuffer &,Pool &) )

C:\lib\apache-log4cxx-0.10.0\src\main\cpp\bytearrayoutputstream.cpp
L:44 std:: 追加

未定義の関数 'memcpy' を呼び出した(関数 ByteArrayOutputStream::write(ByteBuffer &,Pool &) )


最後はリンクエラー

C:\lib\apr\file_io\win32\filedup.c
L:71 #ifdef _WIN32_WCE を #if defined(_WIN32_WCE) || defined(__BORLANDC__) に変更

未解決の外部参照 '__dup2' が C:\LIB\APACHE-LOG4CXX-0.10.0\TARGET\DEBUG\STATIC\APR-1.LIB|filedup から参照されました
未解決の外部参照 '__setmode' が C:\LIB\APACHE-LOG4CXX-0.10.0\TARGET\DEBUG\STATIC\APR-1.LIB|filedup から参照されました

WCE とは Windows CE のこと?
__dup2と__setmodeはたぶんbccにもないのでWCEと同じAPR_ENOTIMPLを返す処理にしておく。

C:\lib\apache-log4cxx-0.10.0\build.xml
L:32
syslibset libsにpsdk/odbc32を追加

未解決の外部参照 'SQLAllocHandle' が C:\LIB\APACHE-LOG4CXX-0.10.0\TARGET\DEBUG\SHARED\LOG4CXX_OBJ\ODBCAPPENDER.OBJ から参照されました
未解決の外部参照 'SQLExecDirectW' が C:\LIB\APACHE-LOG4CXX-0.10.0\TARGET\DEBUG\SHARED\LOG4CXX_OBJ\ODBCAPPENDER.OBJ から参照されました
未解決の外部参照 'SQLGetDiagRecA' が C:\LIB\APACHE-LOG4CXX-0.10.0\TARGET\DEBUG\SHARED\LOG4CXX_OBJ\ODBCAPPENDER.OBJ から参照されました
未解決の外部参照 'SQLFreeHandle' が C:\LIB\APACHE-LOG4CXX-0.10.0\TARGET\DEBUG\SHARED\LOG4CXX_OBJ\ODBCAPPENDER.OBJ から参照されました
未解決の外部参照 'SQLSetEnvAttr' が C:\LIB\APACHE-LOG4CXX-0.10.0\TARGET\DEBUG\SHARED\LOG4CXX_OBJ\ODBCAPPENDER.OBJ から参照されました
未解決の外部参照 'SQLDriverConnectW' が C:\LIB\APACHE-LOG4CXX-0.10.0\TARGET\DEBUG\SHARED\LOG4CXX_OBJ\ODBCAPPENDER.OBJ から参照されました
未解決の外部参照 'SQLDisconnect' が C:\LIB\APACHE-LOG4CXX-0.10.0\TARGET\DEBUG\SHARED\LOG4CXX_OBJ\ODBCAPPENDER.OBJ から参照されました

bccのときにpsdk/odbc32.libをリンクするように変更


これでコンパイルはできたんだけど、なぜかstatic版.libファイルが見当たらない…
sharedディレクトリにはdllファイルがあるんだけど。
もしかしてdll版しかないのだろうか。

*1:今使っているのがBDS2006だからかもしれない。もしかしたら最新版のbccだとエラーにならないのかもね