• ベストアンサー

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

  • qdoba
  • お礼率81% (9/11)

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

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

う~ん, そうなるととりあえず main.cpp のタイムスタンプと make のデータベースをチェックする, かなぁ? 前者は main.cpp を修正する前とあとで (ls -l などで) タイムスタンプをチェックする, 後者は make -np で出てくるものから「main.o を作る規則」や「program を作る規則」をチェックする, くらいかな.

qdoba
質問者

お礼

そういうやり方があったんですね。コメントをコピーさせてもらいましたので、また調べてみます。ありがとうございます。 program : main.o のラインのmain.oの前にDeleteObjを加えたらとりあえずmain.oを先に削除してくれるようになってコンパイルもするようになりました。makefileのことはよくわからないので、よく考えてみれば何が普通なのかわかってません。

その他の回答 (2)

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

make が何か表示していると思うので, そのメッセージを書いてもらえませんか?

qdoba
質問者

お礼

ありがとうございました。

qdoba
質問者

補足

どうもありがとうございます。 最初makeってタイプしたとき g++ -Wall -c main.cpp g++ -o program main.o で、main.cppの内容を変更してセーブしてからまたmakeってタイプしたとき make: `program' is up to date. 普通だったらまたコンパイルされると思うのですが、されないのでいちいちmain.oを削除してます。

回答No.1

g++ の行と rm の行のそれぞれ先頭にタブコードが入っていますか? 入っていなければ、入れてみてください。

qdoba
質問者

お礼

お礼はここでした。ありがとうございます。

qdoba
質問者

補足

どうもありがとうございます。 タブは入ってますが、ここにコピーして投稿したときに取り除かれてしまったみたいです。

関連するQ&A

  • 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]を実行させたい 以上です。

  • 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

  • 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のファイルの中身は問題ありません。 他のパソコンではキチンとコンパイルに成功しています。

  • 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 *** 最初のターゲットより前にコマンドを起動. 中止.」 です。

  • Makefileについて

    Qtで、ちょっとしたプログラムを書いたのですが、あえてqmakeは使わずに自分でMakefileを書いてみました。 以下、Makefileの内容(タブは全角空白2個に置き換えてます) #QtApp template #Variables #  Package infomation NAME        =  DPMWindow #  Resources C_SOURCE      =   CPP_SOURCE      =  src/DPMArk.cpp\           src/DPMMaster.cpp \           src/DPMNode.cpp \           src/DPMResult.cpp \           src/DPMWindow.cpp \           src/main.cpp MO_HEADER      =  include/DPMWindow.h UI        =  share/ui/DPMWindow/DPMWindow.ui OTHER_RESOURCE1      =  share/icons/DPMWindow/icon.png OTHER_RESOURCE2      =   #  Compiling settings DEFINE        =  -DPATH=\"/usr/local\" INC_DIR        =  include LIB_DIR        =   LINK_LIB_FLAG      =   PKG_CONFIG      =  `pkg-config --cflags --libs QtGui` OUTPUT_DIR      =  bin #  Install settings INSTALL_ROOT      =  /usr/local BIN_INSTALL_DIR      =  bin OTHER_RESOURCE1_INSTALL_DIR  =  share/icons/DPMWindow OTHER_RESOURCE2_INSTALL_DIR  = #Invariables #  Package infomation BIN_FILE_NAME      =  $(NAME) #  Resources MOC_CPP_SOURCE      =  $(MO_HEADER:%.h=%.mo.cpp) UI_HEADER      =  $(UI:%.ui=%.ui.h) OBJ        =  $(C_SOURCE:%.c=%.o) $(CPP_SOURCE:%.cpp=%.o) $(MOC_CPP_SOURCE:%.cpp=%.o) #  Compiling and Archiving settings OUTPUT        =  $(OUTPUT_DIR)/$(BIN_FILE_NAME) INCLUDE_FLAG      =  $(patsubst %,-I%,$(INC_DIR)) $(patsubst %,-I%,$(dir $(UI))) LIB_FLAG      =  $(patsubst %,-L%,$(LIB_DIR)) #  Commands CC        =  gcc -o CPPC        =  g++ -o CC_OBJ        =  gcc -c -o CPPC_OBJ      =  g++ -c -o MOC        =  moc-qt4 -o UIC        =  uic-qt4 -o RM        =  rm -Rf MKDIR        =  mkdir -p TEST        =  test -d INSTALL        =  install -m 0755 -p CP        =  cp -R #  Install settings INSTALLED_BIN      =  $(addprefix $(INSTALL_ROOT)/$(BIN_INSTALL_DIR)/, $(notdir $(OUTPUT))) INSTALLED_OTHER1    =  $(addprefix $(INSTALL_ROOT)/$(OTHER_RESOURCE1_INSTALL_DIR)/, $(notdir $(OTHER_RESOURCE1))) INSTALLED_OTHER2    =  $(addprefix $(INSTALL_ROOT)/$(OTHER_RESOURCE2_INSTALL_DIR)/, $(notdir $(OTHER_RESOURCE2))) all: $(OUTPUT) $(OUTPUT): $(UI_HEADER) $(OBJ)   $(CPPC) $(OUTPUT) $(OBJ) $(LIB_FLAG) $(LINK_LIB_FLAG) $(PKG_CONFIG) %.o: %.c   $(CC_OBJ) "$@" $(DEFINE) $(INCLUDE_FLAG) $(LIB_FLAG) "$<" $(LINK_LIB_FLAG) $(PKG_CONFIG) %.o: %.cpp   $(CPPC_OBJ) "$@" $(DEFINE) $(INCLUDE_FLAG) $(LIB_FLAG) "$<" $(LINK_LIB_FLAG) $(PKG_CONFIG) %.mo.cpp: %.h   $(MOC)"$@" "$<" %.ui.h: %.ui   $(UIC) "$@" "$<" clean:   $(RM) $(OBJ) $(MOC_CPP_SOURCE) $(UI_HEADER)   $(RM) ./*/*~ ./*~ install: install_bin install_other1 install_other2 install_bin:   $(TEST) $(INSTALL_ROOT)/$(BIN_INSTALL_DIR) | $(MKDIR) $(INSTALL_ROOT)/$(BIN_INSTALL_DIR)   $(INSTALL) $(OUTPUT) $(INSTALL_ROOT)/$(BIN_INSTALL_DIR)/$(LIB_FILE_NAME) install_other1: $(OTHER_RESOURCE1) $(OTHER_RESOURCE1):   $(TEST) $(INSTALL_ROOT)/$(OTHER_RESOURCE1_INSTALL_DIR) | $(MKDIR) $(INSTALL_ROOT)/$(OTHER_RESOURCE1_INSTALL_DIR)   $(CP) $(OTHER_RESOURCE1) $(INSTALL_ROOT)/$(OTHER_RESOURCE1_INSTALL_DIR) install_other2: $(OTHER_RESOURCE2) $(OTHER_RESOURCE2):   $(TEST) $(INSTALL_ROOT)/$(OTHER_RESOURCE2_INSTALL_DIR) | $(MKDIR) $(INSTALL_ROOT)/$(OTHER_RESOURCE2_INSTALL_DIR)   $(CP) $(OTHER_RESOURCE2) $(INSTALL_ROOT)/$(OTHER_RESOURCE2_INSTALL_DIR) uninstall: uninstall_bin uninstall_bin:   $(RM) $(INSTALLED_BIN) 以上、Makefileの内容 makeはちゃんとでき、プログラムも実行できるのですが、makeの最後に記述した覚えのない rm include/DPMWindow.mo.cpp が実行されます。 まぁ、別に困らないのですが、Makefileを何度か見直しても分からなかったので、原因が分かれば回答をお願いします。

  • 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 $@ $< ここはどのように記述したらいいのでしょうか? 回答お願いします。

  • Makefileについて

    同じディレクトリに、同名のa.plとa.cファイルが存在します。 それぞれは単独では問題なく動きます。 しかし、Makefileを使ってこれらのファイルを一緒に実行させたいのですが、make allrunでa.pl、a.cが実行された後に make: *** [allrun] エラー 14 と出てしまいます。 結果的には全て実行できた形になるのですが、エラーと出ているのでどうも不安です。 勉強中の身なので説明がうまくいっていないと思いますが、どうやればよいのか教えてください。 Makefileの中身は CC = gcc all:a a a:a.c $(CC) -o a a.c -lm allrun:a a ./a.pl ./a.out clean: -rm ./a -rm ./a です。

    • ベストアンサー
    • Perl
  • 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)

  • Makefile.inとMakefile.am

    回路設計をするためにsystemCをlinux(centOS)にインストールしました。サンプルプログラムの入ったディレクトリがあってそのサンプルプログラムをコンパイルして実行したいです。ところがコンパイルの仕方がわかりません。 例)rsaというディレクトリの内容 [root@localhost rsa]#ls -l -rw-r--r--. 1 root root 2023 11月 27 21:24 2012 Makefile.am -rw-r--r--. 1 root root 16276 11月 27 21:24 2012 Makefile.in -rw-r--r--. 1 root root 2072 11月 27 21:24 2012 README -rw-r--r--. 1 root root 14137 11月 27 21:24 2012 rsa.cpp -rw-r--r--. 1 root root 4644 11月 27 21:24 2012 rsa.vcproj 予想するに、systemCをインストールするときに $./configure $make $make install と打ったので、Makefile.inとMakefile.amがあやしいと思うのですが、これをどのように使ったらよいのやらわかりません。 教えてください。もしくは、参考文献などを教えてください。 すみません。

  • 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

専門家に質問してみよう