gcjでオブジェクトファイル.objの生成方法

このQ&Aのポイント
  • gcjとgccを使用して、環境がwinXPsp3の場合に、オブジェクトファイル.objを生成する方法を教えてください。
  • gcjとgccを使用して、環境がwinXPsp3の場合に、オブジェクトファイル.objを生成する方法がわかりません。コンパイルオプションを変更してもエラーが出てしまいます。助けてください。
  • gcjとgccを使用して、環境がwinXPsp3の場合に、オブジェクトファイル.objを作成する方法について教えてください。--main=testを取り除くとエラーが出ます。マニュアルやインターネットで調べても解決策が見つかりませんでした。お願いします。
回答を見る
  • ベストアンサー

gcjでオブジェクトファイル.objの生成方法

環境は、winXPsp3 コンパイラは、gcjとgccです。 次のようなコマンドを書きました。(JNIを試したかったのです。最初の辺の手順は省略します。いろんなサイトで、紹介されているからです。) gcj --jni --main=test -o test.exe test.o test.class です。これを実行すると、実行可能形式のtest.exeができます。当たり前ですが・・・。 これを、.obj ファイルで出力したいのですがどういう風にコンパイルオプションを変えればいいかわかりません。 --main=testをとってもエラーになります。エラーログを載せたかったのですが、文字化けしていて読めません。 -c オプションを付けると--main=testにかかわらず C:\jni\test>gcj --jni --main=Test -c -o Test.obj TestC1.o Test.class gcj: cannot specify `main' class when not linking というエラーが出ます。 マニュアルにも載っていないし、調べてもわからないしで、本当に困っています。JNIはあまりよく分ていないので、よろしくおねがいいたします。

  • maro4
  • お礼率66% (4/6)
  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.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オプションを同時に指定することはできないのです。

maro4
質問者

お礼

実際に、色々と試行錯誤しているうちに、薄々不可能ではないだろうか・・・。という風に考えてしまうようになっていたので、回答を下さり、読んでみて納得いたしました。ありがとうございました。一人で考え込まずに書き込んでよかったと思います。

その他の回答 (1)

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.1

.oファイルではなくて.objファイルを出力したいのですか? gcjでは多分出力できないと思います。 .objを出力することで何をしたいのかを補足してくれれば、別のやり方を提案できるかもしれません。

maro4
質問者

補足

回答くださりありがとうございました。どうしようか迷ったのですが、何をしようとしたのかすべて書くことにします。 毎日コミュニケーションの「OS自作入門」という本が元ネタです。本書では、C言語を使っているのですが、Javaではできないものかと調べていたら出会ったのが、JNIでした。 もともとのコンパイラが、gccなので合わせなければいけないと思い、gcjでJNIを使おうとしていました。コンパイラオプションを見ても、objではなく、exeでしか出力できないので、悩みの種でした。 なぜ、objなのかというと、最終的なOSのイメージを作るときに、objを、ブートに関する、objファイルとリンクさせてコンパイルするからです。ですから、実行可能ファイルではまずいのです。 最近のような世の中でなければ、Makefileを公開するのですが、最近は、なにかと生きにくくなっているので、できません。すいません。 JDKならできるのかもしれませんが、gcc中心なので、試していません。gcjとJDKの違いがわかっていないので、申し訳ありません。 なんだか情けない補足で申し訳ないのですが、現在わかる範囲内で書けることを書きました。 よろしくおねがいいたします。

関連するQ&A

  • c++ , template , ファイル分割 , 助けてください...

    //-----------------coord.h------------- template <class type> class coord { type v[3]; public: coord(void); void Show(void); }; //-----------------main.cpp------------ #include<iostream> #include"coord.h" using namespace std; int main(void) { coord<double> ob; ob.Show(); return 0; } //----------------------coord.cpp----------- #include<iostream> #include"coord.h" using namespace std; template <class type> coord<type>::coord(void) { v[0]=v[1]=v[2]=0; } template <class type> void coord<type>::Show(void) { cout << "hello" << endl; } 同一フォルダ内に上記のファイルが 3 つあります. つまり上の 3 つのファイルを分割してコンパイルさせたいです. この状態で...MS-DOSプロンプトからコンパイルします. C:\test>bcc32 -c coord.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland coord.cpp: C:\test>bcc32 -c main.cpp Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland main.cpp: C:\test>bcc32 -emain main.obj coord.obj Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル 'coord<double>::coord<double>()' が未解決(C:\USERS\TAITO\PR OG\CPP\TEST\MAIN.OBJ が参照) Error: 外部シンボル 'coord<double>::Show()' が未解決(C:\USERS\TAITO\PROG\CPP\TE ST\MAIN.OBJ が参照) すると, このようなエラー文が出てしまい 実行可能ファイルができません. コンパイラはbccです. 原因が全く分かりません. 助けてください... ちなみに, 分割せずにコンパイルすると通ります. 自分は c 言語での分割コンパイル経験はあるので それをそのまま c++ 言語でも用いているのですが, 何か変えなければならないのでしょうか?

  • ビルド時のエラー

    行列の計算をする関数をいくつか作り、 それをまとめたファイルmatrix.cを作りました。 自作関数の、M_ADD, M_SUBなどが含まれています。 mainのファイルでmatrix.cをインクルードして、 ビルドしようとしたところ、コンパイルはうまくいくのですが、 リンク時にエラーが起こってしまいました。 具体的には、以下のような感じです。 Linking... matrix.obj : error LNK2005: _M_ADD already defined in main.obj matrix.obj : error LNK2005: _M_SUB already defined in main.obj Debug/計算.exe : fatal error LNK1169: one or more multiply defined symbols found Error executing link.exe. already defined と怒られていますが、 ほかの場所でそんな名前の関数を作った覚えはありません。 関数名をいろいろ変えてみてもだめでした。 ウェブサイトを調べてみても、見当たりませんでした。 これはどういうことなのでしょうか? どうすれば解消できるのでしょうか? どなたかわかるかた、教えていただけませんか? よろしくお願いします。 ちなみに、Visual C++ 6.0を使用しています。

  • jarファイルの作成

    はじめまして。 さっそく質問させていただきます。 Javaでswingを使用してGUIアプリケーションを作成しました。 .exeファイルのようにダブルクリックで起動できるように、jarファイルを作成したのですが、開こうとしてファイルをダブルクリックすると、「failed to load Main-Class manifest attribute from (C:からjarファイルまでの階層)」というエラーがでて実行することができません。 階層は C:\a\b フォルダ b の中に「c.class」「d.class」「MANIFEST.MF」の3つがあります。 c.classがmainメソッドを持っているのでマニフェストファイルには、「Main-Class: c」と書き込み、コマンドプロンプトから「jar cvfm c.jar MANIFEST.MF *.class」と入力、jarファイルが作成されたのですが、ダブルクリックすると上記のエラーがでてしまいます。 どのようにすればエラーなく実行することができるでしょうか? 開発環境は、Windows XP SP3, jdk1.6.0_16, 統合開発環境は使用していません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • VB.NETでDLL関数を呼び出すには

    VB.NETでDLLの関数を呼び出す時に、 NewではなくCreateObject()を使って呼び出すには、 どのように記述をすればよいのでしょうか。 具体的には、 ソリューション名 ClassLibrary1で ---------------------------------- Imports System.Windows.Forms Public Class Class1 Public Sub test() MessageBox.Show("テスト") End Sub End Class ---------------------------------- のコードをビルドしてClassLibrary1.dllを生成して、 ソリューション名 ConsoleApp1で ---------------------------------- Imports ClassLibrary1 Module Module1 Sub Main() Dim obj As Class1 obj = New Class1() 'obj = CreateObject("Class1") obj.test() End Sub End Module ---------------------------------- のコードをビルドして実行すると、 正しく実行できますが、 obj = New Class1() を obj = CreateObject("Class1") のようにすると図のようなエラーになります。 Newではなく、CreateObject()を使ってDLLを呼び出すには、 どのように記述をすればよいのでしょうか。 よろしくお願いします。 (Windows10)(Visual Studio 2022)

  • DB2付きのC言語がコンパイルできません。

    CはMicrosoftVisualStudio2012 DBはIBM DB2 です。 同じ環境でコンパイル実行できていたのに、 PCがおかしくなったのでフォーマットして入れなおしたらコンパイルができなくなりました。 よろしくおねがいします。 ソースはこちらです。 #include <stdio.h> exec sql include sqlca; void main() { exec sql connect to sample; if(SQLCODE!=0) { printf("SQL CONNECT %d", SQLCODE); } else { exec sql update Test1 set col2 = 'bababa'; if(SQLCODE!=0) printf("SQL UPDATE %d", SQLCODE); } exec sql connect reset; } コンパイルコマンドです db2 connect to sample db2 prep Test11.sqc bindfile db2 bind Test11.bnd cl -Z7 -c -W2 -D_X86_=1 -DWIN32 -I"c:\Program Files\IBM\SQLLIB\include" Test11.c link -debugtype:cv -outTest11.exe %1.obj "c:\Program Files\IBM\SQLLIB\lib\db2api.lib" エラーメッセージです Test11.obj : error LNK2019: 未解決の外部シンボル _sqlaaloc@16 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlacall@20 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlasetdata@24 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlastop@4 が関数 _main で参照されました。 Test11.obj : error LNK2019: 未解決の外部シンボル _sqlastrt@12 が関数 _main で参照されました。 Test11.exe : fatal error LNK1120: 5 件の未解決の外部参照

  • 分割コンパイルのリンク時のファイル名の指定法

     Visual Studioコマンドプロンプト(2010)で、分割コンパイルを試みています。自分で調べて、次のことまでは分かりました。 ソースファイル “1.c” “2.c” “3.c” がある。それぞれ、リンクはせずにコンパイルだけ行うには、 “cl /c 1.c”で、“1.obj”が生成する。 “cl /c 2.c”で、“2.obj”が生成する。 “cl /c 3.c”で、“3.obj”が生成する。 これらを、次のようにリンクすると、 “link 1.obj 2.obj 3.obj” ↓ “1.exe” が生成する。  この最後のリンクのところで、“1.exe”でも“2.exe”でも“3.exe”でもない別のファイル名(“program.exe”など)に、実行ファイルを指定したいのですが、 “link /?” を見てみると、どのオプションを指定すればいいか分かりません。どなたか、ご教授ください。お願い致します。

  • makefileを実行すると・・・

    タイトルの通り、makefileを実行したところ、次のようなエラーが出ました。 make: *** No targets. Stop. 考えられる理由としては、何がありますでしょうか? ちなみにmakefileを使わず普通に実行すると成功したので、makefile自体に問題があると思います。 使用しているのはMacのターミナルです。 次がmakefileの内容です。 #Makefile CC = gcc CFLAG = -03 MFLAG = -lm SRC = main.c open.c read_write.c OBJ = main.o open.o read_write.o all:dummy dummy:$(OBJ) $(CC)$(CFLAG) -o dummy $(OBJ) $(MFLAG) main.o: main.c $(CC)$(CFLAG) -c main.c open.o: open.c $(CC)$(CFLAG) -c open.c read_write.o: read_write.c $(CC)$(CFLAG) -c read_write.c clean: rm -f *.o

  • C#のビルド方法について質問です。

    IDEをつかわず、コマンドプロンプト上でC#のソースをビルドする時の方法について質問です。 まず以下のようなコードがあるとします。 まずC:\の直下に以下のソースを作成しました。 =================================================== using System; using System.IO; using System.Windows.Forms; namespace Add.TestClass{ public class LibraryClass{ public LibraryClass(){ MessageBox.Show("クラスライブラリコンストラクタの実行"); } } } =================================================== 上記クラスをdllファイルとしてビルドします。 csc /t:library /out:Add.TestClass library.class  と上記のようにビルドしました。するとAdd.TestClass.dllというファイルが確かにできあがりました。 次にこれを実際に実行するためのファイルをつくりました。 それが以下になります。 同じくC:\直下に以下のようなソースを作成します。 =================================================== using System; using System.IO; using System.Windows.Forms; using Add.TestClass; public class MainClass{ public static void Main(String [] args){ LibraryClass obj = new LibraryClass(); } } =================================================== このファイルをビルドします。 csc /r:Add.TestClass.dll main.cs としてビルドし、その後 mainというファイルを実行しました。 するとキチンとMessageBoxで MessageBox.Show("クラスライブラリコンストラクタの実行");が実行されました。 ここまでは問題ないのですが、この場合 main.exeファイルとAdd.TestClass.dllというファイルが 同じ階層に存在するような状態になっているのですが、これを main.exeファイルのある階層にdllというディレクトリを作成し そのdllの中にAdd.TestClass.dllというファイルをおいた階層状況でmain.exeファイルを実行したいのです。 そのためにまず、 csc /r:”C:\dll\Add.TestClass.dll" main.cs 上記のようなビルドオプションでビルドしてみたのですが、ビルドはとおりましたが -------------------------------------------------------------------------------------------------------------------- ハンドルされていない例外: System.IO.FileNotFoundException: ファイルまたはアセン ブリ 'Add.TestClass, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'、ま たはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりませ ん。 場所 MainClass.Main(String[] args) -------------------------------------------------------------------------------------------------------------------- というエラーがでました。 このdllファイルを特定の任意のディレクトリ内において、main.exeを実行してうまく動くようにするためには どのようなビルドオプションをつけたらいいのでしょうか? よろしくご教授お願いいたしま。

  • Jarファイルのマニフェストについて

    マニフェスト内でMain-Classを指定してJarファイルを作成した場合、EXEに近い仕組み(Jarファイルをダブルクリックでプログラムが実行可能)が実現しますが、この際、マニフェスト内でMain-Classに渡すArgmentsやJavawに適用するオプション(-Dなど・・)を指定することは可能なのでしょうか? また可能な場合、どのように指定すればよいのでしょうか?

    • ベストアンサー
    • Java
  • C言語からJavaに書き換えの質問です。

    C言語で書かれた短いプログラムを、Javaならどう書くかということを考えることになり、かなりの時間を費やして、ググったりして、なんとかそれらしい形になったのですが、1か所だけエラーになり、途方にくれております。助言・こうすればよい的なこと、気付いたこと、などどんなことでもかまいませんので(趣旨のずれたものは、残念ながら相手にできません)ご教授願います。お願いいたします。 詳しくは後述します。 Cのプログラムと、Javaのプログラムと、エラーログを載せます。 Cのプログラムーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー bootpack.c void main(void) { int i; char *p; for (i = 0xa0000; i <= 0xaffff; i++) { (int)p = i; *p = i & 0x0f; } } Javaで書いたプログラムーーーーーーーーーーーーーーーーーーーーーーー bootpack.java public class bootpack { public static void main() { int i; String p; for (i = 0xa0000; i <= 0xaffff; i++) { (int)p=i; p = i & 0x0f; } } } エラーログーーーーーーーーーーーーーーーーーーーーーーーーー C:\tolset\java>make run C:\tolset\java>..\z_tools\make.exe run ../z_tools/make.exe -r img make.exe[1]: Entering directory `C:/tolset/java' ../z_tools/make.exe -r haribote.img make.exe[2]: Entering directory `C:/tolset/java' ../z_tools/gcj/bin/gcj.exe -c -Os -o bootpack.obj bootpack.java bootpack.java:9: error: Invalid expression statement. (int)p = i; ^ 1 error make.exe[2]: *** [bootpack.obj] Error 1 make.exe[2]: Leaving directory `C:/tolset/java' make.exe[1]: *** [img] Error 2 make.exe[1]: Leaving directory `C:/tolset/java' ..\z_tools\make.exe: *** [run] Error 2 C:\tolset\java> ここまでーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー エラーログを見れば、一目瞭然に、(int)p=i; がおかしいことはわかるのですが、何がおかしいのか散々修正してみたのですがわかりませんでした。調べられるものはほとんど調べたのですが、おかしい点に、気付かれましたら、ご教授願えれば幸いです。 あと補足ですが、CのプログラムをJavaのプログラムにしようとすること自体がおかしい。とかの質問自体を完全否定するようなことを言われた場合も無視しますがご理解ください。 よろしくおねがいいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう