dポイントプレゼントキャンペーン実施中!

Java初心者です。開発環境は、Windows7 32ビットマシンです。先日、GCJを使えば、Javaソースコードを直接ネイティブのオブジェクトコード(マシン語)にコンパイルできると教わったので、早速MinGW Installerをインストールし、MinGW Installerの中から「The GNU Java Compiler」を選択しインストールしました。次にWindowsのシステム環境変数画面で、「C:\MinGW\bin」にPathを設定しました。この状態で、定番の「Helloプログラム」をメモ帳で書き(ファイル名: Hello.java)、「C:\Users\Owner」ディレクトリに置き、以下のコマンドで、GCJによりHello.javaを直接ネイティブのオブジェクトコードにコンパイルし、Hello.exeというオブジェクトコードを生成しようとしましたが、以下のエラーメッセージが出てしまいます。

C:\Users\Owner>gcj --main=Hello -o Hello.exe Hello.java
/mingw/lib/libgcj.a(win32.o):win32.cc:(.data+0x0): multiple definition of `_CRT_MT'
/mingw/lib/libmingw32.a(crtst.o):(.bss+0x0): first defined here
/mingw/lib/libmingw32.a(setargv.o):(.text+0x30): undefined reference to `__chkstk_ms'

どうやらlibgcjが既に定義済みのCRT_MTを持っていて、それがmingw32での定義とコンフリクト(重複・矛盾)しているようなのですが、なぜこういう現象が生じたのか、そしてどうすればこのエラーを解決できるのかがわかりません。これに加えて、chkstk_msへの未定義の参照というエラーも出ています。こちらも解決方法が不明です。お詳しい方、できましたらお助け願います。

A 回答 (4件)

undefined reference to `__chkstk_ms'


で検索すると、GCCのバージョンとMinGWのバージョンの不一致で発生するようです。
※ より正確には、GCCがどのMinGW向けにコンパイルされたものかによる。

gcjの開発も止まり、MinGWではGCC4.5以降にgcjが含まれていないことを考えると、MinGWとGCCとgcjの不一致が発生しているのでしょう。

対策は
(1) MinGW,GCC,gcjのバージョンを対応しているものに揃える
(2)最新のMinGW,GCC向けにgcjをソースからコンパイルする
となるでしょう。
    • good
    • 0
この回答へのお礼

kmee様、ご回答ありがとうございました。

>GCCのバージョンとMinGWのバージョンの不一致で発生するようです。
やはりそうですか。エラーメッセージにバージョンナンバーが出てないので違うのかなと最初思いましたが、おっしゃる通りバージョン不一致くらいしか思い当たる原因がなさそうですね。

ご指摘の対策、早速試してみます。因みに、thisiscool.com (https://www.thisiscool.com/gcc_mingw.htm)でみると、GCC/GCJ 4.3 (gcj-eclipse-merge-branch)が最新のようなので、早速それに差し替えてみましたが、同じエラーメッセージが出ました。残りのバージョンも、全て試してみます。

お礼日時:2016/07/10 21:26

>「イベントリスナー」という監視機能があるそうですが、


イベントリスナはインターフェースを介したただのコールバックで
監視機能ではありません。何の契機にコールバックを行なうかは
アプリやライブラリ次第。GUIライブラリなら利用者の
画面操作に関連したイベント処理になるというだけです。
    • good
    • 0

>自分用または自分が勤める会社用のアプリを開発する際に、


>言語としてJavaを選ぶ開発者はいなくなっちゃうと思います

でもムチャクチャ広く使われてますよ。ソフトハウスでは
Javaの仕事が受注の上位です。c++は扱いが難しいので
利用も開発者も減る一方です。

JITに不満を持つ人は少ないです。起動時の遅さが
問題になるケースが少ないからです。
アプリもosもDBもなんだかんだメモリーキャッシュのお世話になるので
起動時はどうせ遅いという事情も有ります。

サーバアプリのような常駐を前提にしたアプリでは
問題有りませんし、無理矢理常駐化という最後の手段もあります。
    • good
    • 0
この回答へのお礼

tknakamuri様、2度目のご回答、ありがとうございました。

>ソフトハウスでは、Javaの仕事が受注の上位です。c++は扱いが難しいので利用も開発者も減る一方です。
>起動時の遅さが問題になるケースが少ないからです。

おっしゃる通りだと思います。

>サーバアプリのような常駐を前提にしたアプリでは問題有りませんし、無理矢理常駐化という最後の手段もあります。

tknakamuri様、厚かましいですが、おさしつかえなければ、もう一つ初心者の素朴な質問をしてもいいでしょうか? Javaでは、「ボタンをクリックする」など特定のイベントが発生した時に所定のメソッドを実行する「イベントリスナー」という監視機能があるそうですが、ボタンやマウスの操作の代わりに、「リアルタイムで変動する特定の変数の値がある値を超えたら所定の処理を実行する」という「イベントリスナー」の設定って、できるのでしょうか? これができれば、サーバアプリではないですが、その特定の変数につき常駐監視(常駐化)を行えることになり、確かに起動時の遅さは問題ではなくなるように思うのですが。ネットで調べた限りでは、ボタンやマウスのケースしか紹介されていませんでした。何かヒントをいただけましたら、うれしいです。別の教えてgoo質問スレッドを立てるべきとすれば、そう致します。

お礼日時:2016/07/10 22:12

エラーはよくわかりませんが


Java1.4対応じゃ実用性無いのでは?
最終リリース2009年で
もう死んでるっぽいです。
    • good
    • 0
この回答へのお礼

tknakamuri様、ご回答ありがとうございました。

「Java1.4対応じゃ実用性無いのでは?」、「最終リリース2009年でもう死んでるっぽいです。」というコメントは、GCJのホームページ(https://gcc.gnu.org/java/)からでしょうか? 確かに「It .... supports most of the 1.4 libraries plus some 1.5 additions.」、「GCJ News Last Enhancement: September 22, 2009」になってますね。それとMinGW経由でインストールしたGCJは、2006年バージョンみたいです。それが最新なんでしょうから、確かに古いです。

ただ、起こったエラーはGCJに関してではなく、MinGWに関するエラーだと思います。GCJをインストールする際に、ほかのパッケージもインストールしたので、それがよくなかったのかもしれません。一旦GCJ以外にインストールしたパッケージを全部削除し、GCJだけにしてリトライしてみようかと思っています。あと、バイトコードからオブジェクトプログラム(マシン語)生成のコンパイル(JREでじゃなくてGCJで)の方も試してみます。こちらができれば、ソースプログラムからできなくても、結果オーライですので。たぶんできないでしょうけど。

因みに、GCJ以外に、Javaソースプログラムを直オブジェクトプログラム(マシン語)にコンパイルできるコンパイラってありますでしょうか? もしそういうものがないとすれば、Javaのアプリは必ず実行マシン用のJREでバイトコードをネイティブマシン語に変換してから実行という余分なステップが一つ入ると思うので、最適化され微差とはいえ、C++などの他のコンパイラ言語を使った場合より実行速度が遅くなるはずで、それなりのディスアドバンテージになりますよね。でも、常識的には、Java(JDK plus JRE)でも結局ネイティブマシン語に変換しているのですから、その変換したネイティブマシン語を予め作れない、ないしは取り出せないなんてことは、あり得ないと思っています。もしこれができないようだと、自分用または自分が勤める会社用のアプリを開発する際に、言語としてJavaを選ぶ開発者はいなくなっちゃうと思います。

お礼日時:2016/07/09 13:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!