bccでlog4cxxをコンパイル
ふと思い立って、log4cxxを使ってみる気になったのでbccでコンパイルしたときの手順を残そうかと。
http://logging.apache.org/log4cxx/building/ant.html
ここの「Building Apache log4cxx with Apache Ant」と「Quick start」を見ながら作業してみた。
どうやらApache Antとcpptasksがコンパイルに必要らしい。
あと、log4cxxが使うライブラリとしてARPとAPR-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"
こんな感じで怒られた…
- cpptasksのコンパイル
(同じく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を解凍
ARPとARP-utilを解凍してディレクトリ名をaprとapr-utilに変更
(c:\libに解凍した)
この3つは同一ディレクトリにおいておけば良いっぽい。
c:\lib\apr c:\lib\apr-util c:\lib\apache-log4cxx-0.10.0
- ようやくlog4cxx本体のコンパイル
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でコンパイルするのが正解っぽい。
具体的なやり方は
- 以下のソースコード類の修正を入れる
- bcc 5.5.1でいったんコンパイルする (なぞのエラーでコンパイルが停止するが、ARPとARP-Utilはコンパイル済み)
- C:\lib\apache-log4cxx-0.10.0\target\debug\sharedディレクトリの中身を削除する (log4cxxも最後のほうまでコンパイルできているのでいったん削除)
- 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\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版しかないのだろうか。