gccコンパイルの「o」オプションとは?

このQ&Aのポイント
  • gccコンパイルの「o」オプションは、オブジェクトファイルをリネームするために使用されます。
  • リネームすることで、出力ファイルの名前を変更することができます。
  • 「o」オプションは、特定のシチュエーションで使用されますが、具体的な詳細は明確ではありません。
回答を見る
  • ベストアンサー

gccコンパイルの「o」オプションについて教えて下さい

こんにちは。 C++を勉強しだしたばかりの弱小物です。 g++でコンパイルする場合に、 oオプションを使用して、 オブジェクトファイルをリネイムしているケースを拝見する場合があるのですが、 何のためにリネイムするものなのでしょうか? なぜ、わざわざリネイムしようとするのか、 その場面が分からないでいます。 ------------------ a.out: c.o cpp.o g++ -o a.out c.o cpp.o ------------------ なんてのを見たりします。 どうゆうシチュエーションで、 意図を持って「o」オプションを使っている流れでしょうか。 以上アドバイスいただけるとありあがたいです。 どうぞ宜しくお願い致します。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

>g++ -o a.out c.o cpp.o これは、オブジェクトファイル c.oとcpp.oをリンクしてa.outに出力する と、いうところは、よろしいですか? gcc/g++などでは、最終的な実行ファイルは(入力ファイル名に関係なく) a.out(Windows版ではa.exe) になります。 演習問題くらいならそれでかまわないのですが、実用的なソフト、たとえば、lsやcatが全て「a.out」では困ります。リネームするにしても、元のa.outがlsから作ったa.outなのかcatからのa.outなのかわかりません。 そこで -o で出力 ファイル名を指定します。 ・-oを使わない場合 gcc ls.c : lsのソースをコンパイルしてファイルa.outに出力 gcc cat.c : catのソースをコンパイルしてファイルa.outに出力 ・-oを使う場合 gcc -o ls ls.c : lsのソースをコンパイルしてファイルlsに出力 gcc -o cat cat.c : catのソースをコンパイルしてファイルcatに出力 #実際のlsやcatはもうちょっと複雑ですが、例ということで。 また、条件付きコンパイルといって、同じソースファイルから条件の違うオブジェクトファイルを作成することができます。(例えば、同じ計算をintで行う低精度高速版とdoubleで行う高精度低速版とか)そんな場合にオブジェクトファイルを区別するのにも使います。 gcc -c -o ex_fast.o -DEX_FAST ex.c : ex.cのソースをEX_FASTの条件でコンパイルしてファイルex_fast.oに出力 gcc -c -o ex_high.o -DEX_HIGH ex.c : ex.cのソースをEX_HIGHの条件でコンパイルしてファイルex_high.oに出力 # 実際には、条件を満す1つだけを使うことが多く、この例のような使い方はあまりみかけません

stadiumk
質問者

お礼

よく理解できました。 ありがとうございました。 これから、「o」オプションを使いこなしていけそうです!

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

・デフォルトの名前では都合の悪いとき ・ファイル名を明示したいとき とかかな.

関連するQ&A

  • octaveのコンパイルオプション

    MATLABのクローンのoctaveを, C++のライブラリとして利用したいと考えているのですが, コンパイルが上手くいきません. プログラムは以下のような単純なものです. --------- begin of hello.cpp ------------------ #include<iostream> #include<octave/config.h> #include<octave/Matrix.h> int main(){ Matrix m(2,2,1.0); cout<<"hello octave !"<<m; return 0; } --------- end of hello.cpp -------------------- 次のようなコンパイルオプションでコンパイルしています. > g++ -I/usr/include/octave-2.1.35/ -L/usr/lib/octave-2.1.35 \ -loctave -lcruft -loctinterp -lreadline -lcurses -llapack \ -lblas -ldl -lg2c -L/home/pippin/name/.redhat/SOURCES/octave-2.1.35/kpathsea \ -lkpathsea hello.cpp すると,次のようなエラーメッセージを返されます. /tmp/ccuvk2IV.o: In function `main': /tmp/ccuvk2IV.o(/text+0x2c): multiple definition of `main' /usr/lib/gcc-lib/i386-redhat-linux/2.96/libg2c.a(main.o)(.text+0x0): first definition here /usr/bin/ld: Warning: size of symbol `main' changed from 58 to 174 in /tmp/ccuvk2IV.o collect2: ld returned 1 exit status エラーメッセージから解するに,libg2c.aでもmain関数が定義されているため, hello.cppのmain関数とかぶるという様な事だと思うんですが,ライブラリに main関数が定義されているというのも変な話です. ちなみに,コンパイルした環境は, OS: redhat linux 7.3 octave version 2.1.35 gcc version 2.96 このタイプのエラーを回避する方法を知っておられる方は, 回答の方よろしくお願いします.

  • コンパイル

    プログラムをコンパイルしようと思い、 $ g++ -o hello hello.cpp と打つのですが、 -bash: g++: command not found と出てきて、コンパイルができません。 ためしにgccとも入れてみましたが、ダメでした。 どなたか教えて下さいm(_ _)mお願いします。

    • 締切済み
    • Mac
  • Windows上でのCmakeの実行(g++で)

    main.cpp, hello.cppのファイルがあり、以下のようにコンパイルして実行できます。 > g++ -c main.cpp hello.cpp # ソースファイルをコンパイルしてオブジェクトファイル(main.o, hello.o)を生成 > g++ -o a.out main.o hello.o # オブジェクトファイルをリンクしてa.outという実行ファイルを生成 これと同じことをcmakeでやることを考えました。手順は以下のようです。 CmakeをインストールしてCMakeLists.txtを上記ソースと同じところに作成しました。 CMakeLists.txtは以下の通りです。 # CMakeのバージョンを設定 cmake_minimum_required(VERSION 2.8) # プロジェクト名と使用する言語を設定 CXXとは?Visual Studioでしょうか。g++ではどうやるのでしょうか。 project(test_cmake CXX) # a.outという実行ファイルをmain.cppとhello.cppから作成 add_executable(a.out main.cpp hello.cpp) main.cpp, hello.cpp,CMakelists.txtが保存されているフォルダ上で、以下の操作をしました。 > mkdir build > cd build > cmake .. 正常に動作しているようです。 > make ←makefileがないので実行できない(そうだろうと思います)これも問題だと思います。makeがないのに。またこのmakeってどこから提供されるものでしょうか。 この手順だと、a.outを作成してくれるはずですが、a.out.vcxprojのようなファイルが出ています。visual studioなのでそうなるだろうとは思いますが。 予定どおり、g++が実行され、a.outが出力されるようにするにはどうしたらいいでしょうか。

  • gccでコンパイル時のエラー

    // test.cpp #include <stdio> using namespace std; int main(int argc, char *argv[]) { printf("test\n"); return 0; } 上記コードをコンパイルしたいのですが make -k g++ -g -O2 -Wall -I. -c test.cpp -o test.obj test.cpp:2:17: stdio: No such file or directory test.cpp: In function `int main(int, char**)': test.cpp:7: error: `printf' was not declared in this scope test.cpp:7: warning: unused variable 'printf' make: *** [test.obj] Error 1 make: Target `all' not remade because of errors. となります。 #include <stdio> using namespace std; を #include <stdio.h> // using namespace std; にすれば正常に終了するのですがなぜでしょうか? gccはMingw5.1.6からインストールしたもので、 バージョンはgcc3.4.5です。 Meadow上から実行しました。 回答よろしくお願い致します。

  • gccですが、コンパイルができません!

    以下のプログラムですが #include <stdio.h> int main() { Int col; char i; scanf( "%d", &col ); for( i = 0 ; i < 26 ; i++ ){ if( i > 0 && ( i % col ) == 0 ) printf( "\n" ); printf( "%c", 'a' + i ); } return 0; } 以上のプログラムをgccでコンパイルしました。 コンパイルするために入力した文字→  gcc p.c -o p.exe 以下のエラーがでてコンパイルできません。 p.c: In function `main': p.c:4: error: `Int' undeclared (first use in this function) p.c:4: error: (Each undeclared identifier is reported only once p.c:4: error: for each function it appears in.) p.c:4: error: syntax error before "col" p.c:7: error: `col' undeclared (first use in this function) p.c:17:2: warning: no newline at end of file  以上なぜコンパイルができないのですか? よろしくお願いいたします。

  • コンパイルエラー?

    FreeBSD上の gcc version 2.95.3 20010315 を用いて c++のコンパイルをしようとしたのですが、 > g++ hoge.cpp hoge.cpp:414: ANSI C++ forbids dessclaration 'value' with no type と出てコンパイルできません。原因や解決策がわかる方は 教えて頂けませんでしょうか。 なお、他のソースファイルでは同様の方法でコンパイルできました。

  • コンパイルオプションの書籍

    お世話になります。 C言語を始めたばかりですが、コンパイル、リンクオプションを書いた 本(または、情報)はありませんか。現状、 bcc32 test.c gcc test.c ぐらいでコンパイルしてます。 算術関数を使っていてgccの場合、-lmを着けないとだめというのに かなり時間がかかりました。 borlandとgccの2つがあれば良いのですが、宜しくお願いします。

  • .oと.outファイルの違い

    gccでコンパイルするとa.outというものができます。 (-oで何も設定しなければ) これはC++のソースファイル1つをコンパイルした時に できる.oのファイルと同一のものでしょうか? #.oは.outの略? .oのファイルの中でmain関数を持っているものが、実行可能形式に なれるのでしょうか?

  • C++ コンパイルオプションについて

    C++標準出力に用いるcoutをコンパイルオプションで 入り切りしたい場合、Makefileにはどのように記述したらいいのでしょうか?また、ソース自体も何か記述する必要はありますか? よろしくお願い致します。

  • GDL(GCC DEVELOPER LITE)のコンパイルについて

    H8/3048Fマイコンのプログラミングをやりはじめた初心者です. これから、秋月製のコンパイラ、アセンブラ、リンカではなくGDLを使用しようと思って、今日から使用し始めたのですが、GDLはリンクまでを一気に行ってしまうのですね。 例えば、A.c,B.c,C.cの三つのC言語ソースファイルをコンパイルして3つをリンクさせようとする場合はどのようにしたらよいでしょうか? 一つ一つコンパイルしてオブジェクトファイルを作成する方法がよくわかりません(マニュアルやヘルプの説明が短い・・・)。 3048Fマイコンを買ったときについてきたサンプルプログラムをコンパイル、リンクしようと考えてるのですが、そこでつまづいています. 3つのC言語ソースファイルを1つにしてやったらできましたが、.MOT形式の出力ファイルがもともと存在していたファイルとサイズがぜんぜん違っているので、何かおかしいのではないかと考えています. 何かわかることがありましたら、何でも良いので教えてください.