- ベストアンサー
gcjでオブジェクトファイル.objの生成方法
- gcjとgccを使用して、環境がwinXPsp3の場合に、オブジェクトファイル.objを生成する方法を教えてください。
- gcjとgccを使用して、環境がwinXPsp3の場合に、オブジェクトファイル.objを生成する方法がわかりません。コンパイルオプションを変更してもエラーが出てしまいます。助けてください。
- gcjとgccを使用して、環境がwinXPsp3の場合に、オブジェクトファイル.objを作成する方法について教えてください。--main=testを取り除くとエラーが出ます。マニュアルやインターネットで調べても解決策が見つかりませんでした。お願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
結論から書くと、Javaを使うのはあきらめたほうがいいでしょう。 .objファイルの生成を突破できたとしてもその先にもっと高いハードルが待っています。 gcjで作ったバイナリの実行にはlibgcjというライブラリが必要です。 Test.classから作った.objファイルをOSイメージに入れただけでは実行できません。 その自作OSにlibgcjを移植する必要があります。 機能の少ないOSやマイナーなOSでJavaプログラムを動かすのは、アセンブラやCのプログラムを動かすのに比べてインフラの準備がはるかに大変です。 Javaプログラムを動かすにはlibgcjのような大規模なランタイムルーチンが必要だからです。 その本の自作OSがどの程度の機能を持っているのかは分かりませんが、きっとlibgcjを簡単に移植して動かせるほどのものではないでしょう。 gcjではなくてJDKを使う場合でも似たようなもので、Java VMを対象のOSに移植する必要があり、生半可なスキルでは不可能です。 A=質問者さんが書きたいプログラムをJava+JNIで書く労力 B=問題の自作OSでJavaプログラムを動かせるようにするための労力 C=質問者さんが書きたいプログラムをC言語で書く労力 とすると、A+B>Cという不等号がなりたつだろうと思います。BとCだけで比較してもきっとB>Cでしょう。これが最初に書いた結論の理由です。 誰かが既にlibgcjやJava VMの移植を済ませてくれているのなら別ですが。 ちなみに、"gcj: cannot specify `main' class when not linking"について。 --mainオプションはリンク時のみ指定できるという意味です。-cオプションを指定すると.oファイルの生成までを行い、リンクは実行しません。このため、-cオプションと--mainオプションを同時に指定することはできないのです。
その他の回答 (1)
- salsberry
- ベストアンサー率69% (495/711)
.oファイルではなくて.objファイルを出力したいのですか? gcjでは多分出力できないと思います。 .objを出力することで何をしたいのかを補足してくれれば、別のやり方を提案できるかもしれません。
補足
回答くださりありがとうございました。どうしようか迷ったのですが、何をしようとしたのかすべて書くことにします。 毎日コミュニケーションの「OS自作入門」という本が元ネタです。本書では、C言語を使っているのですが、Javaではできないものかと調べていたら出会ったのが、JNIでした。 もともとのコンパイラが、gccなので合わせなければいけないと思い、gcjでJNIを使おうとしていました。コンパイラオプションを見ても、objではなく、exeでしか出力できないので、悩みの種でした。 なぜ、objなのかというと、最終的なOSのイメージを作るときに、objを、ブートに関する、objファイルとリンクさせてコンパイルするからです。ですから、実行可能ファイルではまずいのです。 最近のような世の中でなければ、Makefileを公開するのですが、最近は、なにかと生きにくくなっているので、できません。すいません。 JDKならできるのかもしれませんが、gcc中心なので、試していません。gcjとJDKの違いがわかっていないので、申し訳ありません。 なんだか情けない補足で申し訳ないのですが、現在わかる範囲内で書けることを書きました。 よろしくおねがいいたします。
お礼
実際に、色々と試行錯誤しているうちに、薄々不可能ではないだろうか・・・。という風に考えてしまうようになっていたので、回答を下さり、読んでみて納得いたしました。ありがとうございました。一人で考え込まずに書き込んでよかったと思います。