- ベストアンサー
Makefile作成時の拡張子.oとは?
main2.o: main.c gcc -o main2.o -c main.c hello2.o: hello.c gcc -o hello2.o -c hello.c test2: main2.o hello2.o gcc -o test2 main2.o hello2.o のようなMakefile作成時の拡張子.oとは何のファイルという意味なのでしょうか? Makefile作成初心者なのでご教授お願いいたします。
- 0slowlykick0
- お礼率60% (98/162)
- C・C++・C#
- 回答数3
- ありがとう数6
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
これは main.cからmain2.oというオブジェクトファイルを作りなさい。 hello.cからhello2.oというオブジェクトファイルを作りなさい。 main2.oとhello2.oをリンクしてtest2という実行ファイルを作りなさい って事です。 多分、main.cにはmain()関数があり hello.cには別ファイルとしてmain.c内のソースから呼び出している 外部関数が有ると思います。 それをリンクするのに一端オブジェクトファイルを つくりその後リンクして一つの実行ファイルにしているのです。
その他の回答 (2)
- a-saitoh
- ベストアンサー率30% (524/1722)
リロケータブル・オブジェクトファイルあるいは単にオブジェクトファイル、のことです。Windowsなんかだと、 .oではなくて .objという拡張をを使ったりします。 なお、現代のMakeでは .cから.oを得る手順はもともと入っているので、いちいちmakefileに書かなくて良いと思いますよ。
お礼
>なお、現代のMakeでは .cから.oを得る手順はもともと入っているので、いちいちmakefileに書かなくて良いと思いますよ。 Makefileについて一応理解できてきたのでご回答いただいた仕組みについて勉強したいと思います。 ご回答ありがとうございました。
- OsieteG00
- ベストアンサー率35% (777/2173)
オブジェクトファイルの事。 コンパイルという作業で機械語に変換をしますが、一旦オブジェクトファイルという形式にします。この後に実行用ライブラリを結合(リンク)して実行可能形式(exeやcom等)にします。
お礼
意味が理解できました。どうもありがとうございます。機械語に変換したというオブジェクトファイルのことなのですね。ご回答ありがとうございます。
関連するQ&A
- gdbデバッグのためのmakefile作成
現在Ubuntu Linuxでgccプログラミングを行っています。現在、ソースコードをいくつかのファイルに分割して作成しています。コンパイル時はmakefileを使用してmakeして実行ファイルを作成しています。 現在のプログラムをgdbでデバッグできるようにしたいと思っているのですが、 その場合のmakefileはどのようにして書けば良いのかをご教示頂きますよう、お願い致します。 現在のmakefile内容 https://sourceforge.jp/projects/cc1101driver/scm/svn/blobs/2319/trunk/20140411/Makefile #test #CC = gcc #test:main.c event.c exe: main.o event.o env.o audio.o task.o comm.o menu_show_status.o gcc -o exe main.o event.o env.o audio.o task.o comm.o menu_show_status.o -lpthread main.o:main.c gcc -c main.c event.o:event.c gcc -c event.c env.o:env.c gcc -c env.c audio.o:audio.c gcc -c audio.c task.o:task.c gcc -c task.c comm.o:comm.c gcc -c comm.c menu_show_status.o:menu_show_status.c gcc -c menu_show_status.c
- ベストアンサー
- C・C++・C#
- C言語のmakefileについて
C言語のmakefileについて質問です。 例えば下記makefileでは、“CC”というマクロを“gcc”という文字列で再定義しています。 しかし中には(1)『CC = gcc』という定義なしでいきなり(2)『$(CC) -o hello $(objs)』 でコンパイルしているmakefileを見るのですが、その場合(2)は何でコンパイルされているのでしょうか。($(CC)の中身はCC??GCC?ACC??) ※下記ターゲット名等はサンプルです。 ------------------ # Makefile objs = hello.o edajima.o CC = gcc hello: $(objs) $(CC) -o hello $(objs) .PHONY: clean clean: $(RM) hello $(objs)
- 締切済み
- C・C++・C#
- gfortranでmakefile
gfortranのmakefileを作成し、"make test"と実行しても成功しません。 どうすればいいのでしょうか? どこか間違いがあるでしょうか? 下にmakefileを全文載せましたのでアドバイスをよろしくお願いします。 OBJS = main.o tree.o treef.o\ test : ${OBJS} gfortran -c test ${OBJS} main.fやtree.fやtreef.fのファイルの中身は問題ありません。 他のパソコンではキチンとコンパイルに成功しています。
- ベストアンサー
- Linux系OS
- gfortranでmakefile
gfortranのmakefileを作成し、"make test"と実行しても成功しません。 どうすればいいのでしょうか? どこか間違いがあるでしょうか? 下にmakefileを全文載せましたのでアドバイスをよろしくお願いします。 OBJS = main.o tree.o treef.o test : ${OBJS} gfortran -c test ${OBJS} main.fやtree.fやtreef.fのファイルの中身は問題ありません。 他のパソコンではキチンとコンパイルに成功しています。 ちなみに、"make test"と実行して出てくるエラーメッセージが「makefile:3 *** 最初のターゲットより前にコマンドを起動. 中止.」 です。
- ベストアンサー
- Linux系OS
- Makefileについて
makeファイルの書き方で悩んでいます。 makeファイルは書いたことがなく、ほとんど丸写しです。 私がしたいのは、 (1)run:部分で削除するファイルがなかった場合、エラーとなり次の行へ進みません。なくても(エラーでも/エラー回避して)次の行へ進む方法が知りたいです。 もうひとつは(2)run:部分で、cleanを実行し、makeしてrunを実行させる方法が知りたいです。 --------------以下、サンプルMakefileです。 CC = gcc OBJS = main.o sub.o PROG = test.exe .c.o: $(CC) -c $< -o $@ $(PROG) : $(OBJS) $(CC) $(OBJS) -o $(PROG) $(OBJS) : Makefile clean: rm -f *.o $(PROG) run: rm *.log <---- (1)ここでファイルがないとエラーで止まる $(PROG) all: <-- (2)[clean]を実行して、makeして、[run]を実行させたい 以上です。
- ベストアンサー
- C・C++・C#
- gccとmakefileの基礎
makefileの作り方を1から紹介している 書籍はあるでしょうか? 現在、 a.cとb.hとc.a をgccでコンパイルしたいのですが わかりません(汗 gcc -o test a.c b.h c.a じゃだめみたいです。 要するに1つのcファイルと1つのヘッダファイルと1つのライブラリ(静的or動的)を コンパイルする方法が知りたいのです。 ご教授お願い致しますm(____)m
- ベストアンサー
- C・C++・C#
- 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・C++・C#
- makefileの書き方
makefileを書いたのですが、コンパイルしたあとに、main.cppの内容を変更してから、またmakeってタイプして変更した箇所が反映されません。どこがおかしいでしょうか?よろしくお願いします。 program : main.o g++ -o program main.o main.o : main.cpp g++ -Wall -c main.cpp DeleteObj: rm main.o
- ベストアンサー
- C・C++・C#
- Makefileと共有ライブラリ
main.c sub1.c sub2.cに対して 共有ライブラリlibsub1.soとlibsub2.soを生成して それをもちいてmainをコンパイルするMakefileを以下のように記述しました。 CC=gcc LIB= CFLAGS=-Wall TARGET = main SHAD = -shared .SUFFIXES:.so .o SRCS = main.c libsub1.so libsub2.so $(TARGET):$(SRCS) $(CC) -o $@ $(SRCS) @echo "make finished!!" #.o.so: # $(CC) $(SHAD) -o $@ $< libsub1.so:sub1.o gcc -shared -o libsub1.so sub1.o libsub2.so:sub2.o gcc -shared -o libsub2.so sub2.o .c.o: $(CC) -c $< #sub1.o:sub1.c # gcc -c -fPIC sub1.c #sub2.o:sub2.c # gcc -c -fPIC sub2.c clean: @rm -f libsub?.so sub?.o ここで.oから.cを生成するのはサフィックスでできたのですが、同じように.oから.soを生成するのは できませんでした。 #.o.so: # $(CC) $(SHAD) -o $@ $< ここはどのように記述したらいいのでしょうか? 回答お願いします。
- ベストアンサー
- C・C++・C#
- Eclipse 3.5 Galileo + CDT + cygwinで
Eclipse 3.5 Galileo + CDT + cygwinで、CやC++のプログラムを作りたいと考えています。 しかし、ビルドが通らず、困っています。 行った作業手順は、以下の通りです。 (1)まず、下記サイトを参考に、簡単なCプログラムを作りました。 http://www.c.csce.kyushu-u.ac.jp/~seiichirou/wiki/index.php?Makefile%A4%CE%BD%F1%A4%AD%CA%FD ----以下、作成したプログラム---- /* hello.c */ #include <stdio.h> void edajima(void); int main(int argc, char* argv[]) { edajima(); return 0; } /* edajima.c */ #include <stdio.h> void edajima(void); void edajima(void) { printf("わしが男塾塾長 江田島平八である!!\r\n"); } ----プログラムここまで---- (2)そして、Makefileを以下のように作成しました。 ----以下、Makefile---- # Makefile CC = gcc CXXFLAGS = -O2 -g -Wall -fmessage-length=0 OBJS = edajima.o hello.o LIBS = TARGET = hello.exe $(TARGET): $(OBJS) $(CC) -o $(TARGET) $(OBJS) $(LIBS) all: $(TARGET) hello.o: hello.c $(CC) -c hello.c edajima.o: edajima.c $(CC) -c edajima.c clean: rm -f $(OBJS) $(TARGET) ----Makefileここまで---- (3)次に、EclipseでCのMakefileプロジェクトの作成をしました。 ロケーションは、上記ソースやMakefileがあるディレクトリを指定しました。 (4)Eclipseのプロジェクトエクスプローラで、Makefileを右クリックし、[Makeターゲット]-[作成] でMakeターゲットを作成しました。 (5)Makefileを右クリックし、[Makeターゲット]-[ビルド]を実行すると、下記エラーが出て、 ビルドに失敗しました。 make hello gcc -c hello.c gcc hello.o -o hello hello.o:hello.c:(.text+0x17): undefined reference to `_edajima' collect2: ld returned 1 exit status make: *** [hello] Error 1 どうやら、edajima.cがコンパイルされていない様です。 cygwin上でmakeコマンドを実行すると、ビルドできるので、Makefileは間違っていないと思っているのですが・・・。 どなたか、分かる方、ご教授願います。
- ベストアンサー
- C・C++・C#
お礼
リンクする為にオブジェクトファイルに変換しなくてはならないのですね。機械語に変換した後にリンクさせるという仕組みを理解できたので本当に感謝いたします。 ご回答ありがとうございました。