- PR -

hprof.dllのビルドができない[JDK5.0]

1
投稿者投稿内容
BB太郎
会議室デビュー日: 2005/10/06
投稿数: 1
投稿日時: 2005-10-06 19:01
現在、hprofのカスタマイズを行なおうと思っており、windows上でhprofのビルドを試みています。
まずはJDKのデモの中に含まれているソースを使って、そのままの状態でビルドをしたいと思っているのですがうまく行きません。

hprofのソースは
%JAVA_HOME%\\demo\\jvmti\\hprof\\src
に格納されており、これをそのまま利用しています。
つまり、ここのソースをコンパイル→リンクしてdllを作成しようとしているわけです。

いくつかのやり方を試したのですが、どれも同じコンパイルエラーが出てうまく行きません

下記はバッチファイルを用いてビルドを行なった失敗例です。

処理やオプション等は同ディレクトリにサンプルで入っているmakefile(sample.makefile.txt)の記述を参考にして作成しました。
src\\windowsフォルダの中に、hprof_md.cというファイルがあるのですが、Winの場合はこれがsrcフォルダにコピーされた後コンパイルされているようです。

%JAVA_HOME%\\demo\\jvmti\\hprof\\src フォルダでこのバッチを起動しています。
---ビルド用バッチ----------------------------------
set JDK_INC=C:\\Program Files\\Java\\jdk1.5.0_05\\include
set CFLAGS= -Ox -Op -Zi -Gy -W0 -WX -DHPROF_LOGGING -DNDEBUG -I. -I..\\..\\java_crw_demo\\src -I"%JDK_INC%" -I"%JDK_INC%\\win32"

del /F *.obj *.exp *.lib
del /F hprof_md.c

copy .\\windows\\hprof_md.c hprof_md.c

cl %CFLAGS% /c *.c

link -dll -out:MyHprof.dll *.obj wsock32.lib winmm.lib

pause
------------------------------------------------------

この結果、hprof_md.cのコンパイルだけがうまく行きません(下記、出力結果を参照下さい)。
他のCファイルは正常にコンパイルされているようです。
最後のリンクエラーはhprof_md.cのコンパイルエラーが解決できれば、同時に解消されるのではないかと思っています。

-----ビルド結果---------------------------------------
debug_malloc.c
hprof_blocks.c
hprof_class.c
hprof_cpu.c
hprof_error.c
hprof_event.c
hprof_frame.c
hprof_init.c
hprof_io.c
hprof_ioname.c
hprof_listener.c
hprof_loader.c
hprof_md.c
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(99) : error C2011: 'fd_set' : 'struct' で示される型としてすでに定義されています。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(134) : メモ C6311: C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock.h(83) : 'FD_SET' の前の定義を確認してください
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(143) : error C2011: 'timeval' : 'struct' で示される型としてすでに定義されています。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(199) : error C2011: 'hostent' : 'struct' で示される型としてすでに定義されています。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(212) : error C2011: 'netent' : 'struct' で示される型としてすでに定義されています。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(219) : error C2011: 'servent' : 'struct' で示される型としてすでに定義されています。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(226) : error C2011: 'protoent' : 'struct' で示される型としてすでに定義されています。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(310) : error C2011: 'in_addr' : 'struct' で示される型としてすでに定義されています。

【 中略 】

C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(2258) : error C2375: 'WSAAsyncGetProtoByNumber' : 再定義されています。異なるリンケージです。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock.h(810) : 'WSAAsyncGetProtoByNumber' の宣言を確認してください。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(2283) : error C2375: 'WSAAsyncGetHostByName' : 再定義されています。異なるリンケージです。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock.h(814) : 'WSAAsyncGetHostByName' の宣言を確認してください。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(2310) : error C2375: 'WSAAsyncGetHostByAddr' : 再定義されています。異なるリンケージです。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock.h(818) : 'WSAAsyncGetHostByAddr' の宣言を確認してください。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(2333) : error C2375: 'WSACancelAsyncRequest' : 再定義されています。異なるリンケージです。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock.h(822) : 'WSACancelAsyncRequest' の宣言を確認してください。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock2.h(2353) : error C2375: 'WSAAsyncSelect' : 再定義されています。異なるリンケージです。
C:\\Program Files\\Microsoft Visual Studio\\VC98\\include\\winsock.h(824) : 'WSAAsyncSelect' の宣言を確認してください。
hprof_monitor.c
hprof_object.c
hprof_reference.c
hprof_site.c
hprof_stack.c
hprof_string.c
hprof_table.c
hprof_tag.c
hprof_tls.c
hprof_trace.c
hprof_tracker.c
hprof_util.c
コードを生成中...

C:\\Program Files\\Java\\jdk1.5.0_05\\demo\\jvmti\\hprof\\src>link -dll -out:MyHprof.dll *.obj wsock32.lib winmm.lib
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

ライブラリ MyHprof.lib とオブジェクト MyHprof.exp を作成中
hprof_init.obj : error LNK2001: 外部シンボル "_md_get_milliticks" は未解決です
hprof_io.obj : error LNK2001: 外部シンボル "_md_get_milliticks" は未解決です
hprof_init.obj : error LNK2001: 外部シンボル "_md_init" は未解決です
hprof_util.obj : error LNK2001: 外部シンボル "_md_snprintf" は未解決です

【 中略 】

hprof_listener.obj : error LNK2001: 外部シンボル "_md_ntohs" は未解決です
hprof_listener.obj : error LNK2001: 外部シンボル "_md_ntohl" は未解決です
hprof_listener.obj : error LNK2001: 外部シンボル "_md_shutdown" は未解決です
hprof_tls.obj : error LNK2001: 外部シンボル "_md_get_thread_cpu_timemillis" は未解決です
MyHprof.dll : fatal error LNK1120: 外部参照 29 が未解決です。
------------------------------------------------------

また、問題のhprof_md.cだけのコンパイルを行なってみようと思い、srcフォルダ上にhprof_md.cをコピーした後、
コマンドプロンプトから以下のようなコマンドでもコンパイルを試みましたが同じコンパイルエラーが出力されました。
----------------------------------------------
cl -Ox -Op -Zi -Gy -W0 -WX -DHPROF_LOGGING -DNDEBUG -I. -I../../java_crw_demo/src -I"%JAVA_HOME%"/include -I"%JAVA_HOME%"/include/win32 -c hprof_md.c
----------------------------------------------

%JDK_HOME%\\demo\\jvmti\\hprof\\srcに入っている「sample.makefile.txt」
を活用するため、cygwinからGNU makeを使用してmakeしても同じエラーが出ました。
(↑何箇所かパスの書き換えが必要な部分がありました)

当方の開発環境は以下の通りです
-----------
windows Xp
J2SE5.0
[←JAVA_HOME=C:\\Program Files\\Java\\jdk1.5.0_05]
VC++6.0
-----------

どなたか、同じ様な現象に遭遇された方、もしくは関連する知識をお持ちの方がいらっしゃいましたら是非ご教授下さいませ。
お恥かしながらC/C++の開発に不慣れなもので、現状、対応策が分からない状態です。
当方の知識不足、勘違い等であればお許し下さい。

それでは、よろしくお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)