Makefileについて

このQ&Aのポイント
  • Qtでのプログラム作成において、qmakeを使わずにMakefileを書く方法について説明します。
  • Makefileには様々な設定項目があり、コンパイルやアーカイブの設定、インストール設定などがあります。
  • Makefileの最後に記述された不要なコマンドの実行について、原因が分からず困っている場合は、Makefileを見直すことをおすすめします。
回答を見る
  • ベストアンサー

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を何度か見直しても分からなかったので、原因が分かれば回答をお願いします。

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

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

お礼

ありがとうございます。 中間ファイルは自動で消されるということですね。

関連するQ&A

  • makefile

    以下の# compilationのところなんですが、-lip -limage -ltiff -lm というオプションの意味と、$@という表記の意味、/bin/cpがどんなコマンドなのか、$(CC)の行と/bin/cpの行はどのようなつながりなのか、こんがらかってしまいました。どなたか教えていただけないでしょうか。 # # xconv Makefile # # Practical Algorithms for Image Analysis # # Copyright (c) 1997, 1998, 1999 MLMSoftwareGroup, LLC # SHELL = /bin/sh NULL = CC = /usr/bin/gcc HOME = ../.. BIN = $(HOME)/binlin IPATH = -I. -I$(HOME)/libtiff/libtiff -I$(HOME)/libimage -I$(HOME)/libip LPATH = -L$(HOME)/libtiff/libtiff -L$(HOME)/libimage -L$(HOME)/libip COPTS = -g -O # OPTIONAL DEFINES ################################# DEFOPTS = -DLINUX # SET CC COMPILE FLAGS ############################# CFLAGS = $(COPTS) $(IPATH) $(DEFOPTS) CC = /usr/bin/gcc LIB_TIFF=$(HOME)/libtiff/libtiff LIB_IMAGE=$(HOME)/libimage LDFLAGS=$(OPTIONS) XCONV = xconv # EXECUTABLES ####################################### EXECS = $(XCONV) # OBJECT FILES ##################################### XCONVO = xconv.o # COMPILATION ###################################### all: $(EXECS) $(XCONV): $(XCONVO) $(CC) $(COPTS) $(XCONVO) $(LPATH) -lip -limage -ltiff -lm -o $@ /bin/cp $@ $(BIN) # HEADER DEPENDENCIES ############################### HDRS = $(HOME)/libimage/tiffimage.h \ $(HOME)/libimage/draw.h \ $(NULL) $(XCONVO): $(HDRS) clean: rm -f $(EXECS) *.o *.a core # START OVER ######################################## new: rm -f $(EXECS) *.o *.a core make

  • Perlでディレクトリごと削除したい

    telnet.cgiを使って、カレントディレクトリで、 rm -rf * を行っても、なぜか(permissin 755にも関わらず)permission denyといわれうまく削除できませんでした。 そこで、perlを使って削除を試みたいのですがどのようにすれば、削除できますか? 参考になりそうなソースを見つけたのですが、ディレクトリの中にディレクトリがある構造のためうまく削除できませんでした。 どなたか、改良していただけないでしょうか? お手数ですが、宜しくお願い致します。 #!/usr/local/bin/perl $dir = "./d/"; opendir DIR, $dir; @files = grep { !m/^(\.|\.\.)$/g } readdir DIR; close DIR; $flag = @files; if ( $flag ) { foreach $file ( @files ) { unlink "$dir$file"; } } rmdir $dir;

    • ベストアンサー
    • CGI
  • Tomcatの起動ができません。

    初めまして。 Tomcatについてなのですが、 インストール自体はできたみたいで、Tomcatのフォルダの直下のbinの直下のstartup.shを実行しても、 ---------------------------------------- [root@java bin]# ./startup.sh Using classpath: /usr/src/jakarta/jakarta-tomcat/lib/*:/usr/java/jdk1.3.0_02/lib /tools.jar [root@java bin]# ----------------------------------------- のようになり、Tomcatが起動されません。 何かわかることがありましたら、ご教授お願い致します。 ちなみに環境設定は以下のようにrootディレクトリ直下の.bashrcに設定しています。 export JAVA_HOME=/usr/java/jdk1.3.0_02 export PATH=$PATH:$JAVA_HOME/bin export TOMCAT_HOME=/usr/src/jakarta/jakarta-tomcat

    • ベストアンサー
    • Java
  • リンク時エラー

    DirectShowのSampleGrabberを使ったプログラムをborland C++ コンパイラでコンパイルしようとしたときにエラーが出てしまいます。 bcc32 -I"C:\Borland\Bcc55\Include" -L"C:\Borland\Bcc55\Lib" -I"c:\Program Files\Microsoft Platform SDK\Include" -L"c:\Program Files\Microsoft Platform SDK\Lib" -L"C:\Program Files\Microsoft DirectX 9.0 SDK (October 2005)\Lib" -------------------------------------------------- Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '_CLSID_SampleGrabber' が未解決(C:\CPP\DIRECTSHOW\CTHUMBNAI L.OBJ が参照) Error: 外部シンボル '_IID_ISampleGrabber' が未解決(C:\CPP\DIRECTSHOW\CTHUMBNAIL .OBJ が参照) Error: 外部シンボル '_MEDIATYPE_Video' が未解決(C:\CPP\DIRECTSHOW\CTHUMBNAIL.OB J が参照) Error: 外部シンボル '_MEDIASUBTYPE_RGB24' が未解決(C:\CPP\DIRECTSHOW\CTHUMBNAIL .OBJ が参照) Error: 外部シンボル '_FORMAT_VideoInfo' が未解決(C:\CPP\DIRECTSHOW\CTHUMBNAIL.O BJ が参照) DierctShowは最近Platform SDKに統合されたらしいのでPlatform SDKからインクルードしています。 ご存知の方がいらっしゃいましたらご教授お願い致します。

  • エラー Permission denied

    現在、mingwで94個のプログラムをコンパイルするのにGNUMAKEを使っています。 make all で登録されたプログラムを全コンパイルすると、 その過程で133個のオブジェクトファイルが作られるのですが、途中で次のようなエラーが発生することがあります。 「することがある」というのが厄介な点で、ソースコードを一切変更せずに同じ操作をしても、 エラーが出るタイミングが違うのです。 まったくエラーの出ないこともありますが、たいがいは中盤で次のようなメッセージを出力して停止します。 gcc --input-charset=cp932 --exec-charset=cp932 -Wall -s -O3 -Os -c -o atgc_ratio.obj atgc_ratio.c gcc --input-charset=cp932 --exec-charset=cp932 -Wall -s -O3 -Os -c -o Lib-atgc_count.obj Lib-atgc_count.c gcc -Os -o atgc_ratio.exe atgc_ratio.obj Lib-klonoa.obj Lib-arg2.obj Lib-strdata.obj Lib-log.obj Lib-strdata2.obj Lib-atgcarryget2.obj Lib-atgc_count.obj Lib-file.obj Lib-calender.obj Lib-command.obj c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: reopening atgc_ratio.exe: Permission denied c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: final link failed: Permission denied collect2.exe: error: ld returned 1 exit status make: *** [atgc_ratio.exe] Error 1 上記の例ですと、atgc_ratio.exe をコンパイルしている最中に、「Permission denied」なるものが発生し、makeが動作停止しているものと解釈しております。 再度make all すると何事も無かったかのようにatgc_ratio.exeに必要なオブジェクトファイルをリンクして作業を続行します。 borland C++ compiler 5.5.1(古い!!)でも時たま同じようなエラーが発生するようですが、 そもそもこっちは12年前からバージョンアップしてないので、しょうがないかな?と思います。 一応、-Wall で無警告になるようメンテナンスはしているので、ソースコード自体の問題ではないと思います。 何らかのソフトがファイルをロックしているのかと思い、とりあえずアンチウィルスソフトを一時的に停止してみましたが、 やはりエラーは出ました。 マルチスレッドの問題?とも思ったのですが、マルチスレッドとかマルチコアなどの分野に手を出したことがありませんので見当がつかない状態です。 また最近シングルCPUのWinXP環境から Intel(R) Core(TM) i3-3110M CPU @ 2.40GHz のWin7(32ビット)に移行したばかりで、 マルチCPUなどの使用経験も非常に浅いので、windowsの問題か、コンパイラの問題か、makeなど開発環境の問題か、原因の切り分けができておりません。 これらの問題の原因や対策について詳しい方、ご教授いただければと思います。 現在の環境を次にまとめます。 OS:Windows 7 Professional 32ビット版 (Serbice Pack1) 開発環境:mingw 4.7.2 (mingw-get-inst-20120426.exe を使って最新版をダウンロードしたもの)  コンパイラ:gcc 4.7.2  リンカ:GNU ld (GNU Binutils) 2.23.1  make:GNU Make 3.81 gcc -v の結果 Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.7.2/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.7.2/configure --enable-languages=c,c++,ada,fortran,obj c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo mp --disable-win32-registry --enable-libstdcxx-debug --disable-build-poststage1- with-cxx --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw Thread model: win32 gcc version 4.7.2 (GCC) make -v の結果 GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for i686-pc-msys オブジェクトのコンパイルには次のコマンドを使っています。 gcc --input-charset=cp932 --exec-charset=cp932 -Wall -s -O3 -Os -c -o リンクには次のコマンドを使っています。 gcc -Os -o なお、gccはデフォルトではオブジェクトファイルの拡張子を.oにしますが、 borland C++ も使う関係で、-oオプションでファイル名を直接指定して拡張子を統一しています。 どうかよろしくお願いします。

  • /var/lib/mysql以下に生成される db-bin.xxxファイルって?

    Turbolinux 10 Serverを使っています。 mysqlのバージョンは4.0.20です。 インストール後しばらく使っていたのですが、 /var/lib/mysql以下に  databasename-bin.001  databasename-bin.002  databasename-bin.003  ・  ・  ・ というファイルが多数生成されました。 これらのファイルのサイズは1GByte近くある大きなものもあり、 無視できなくなりました。 これらのファイルは何なのでしょうか? また、このファイルはrmで削除してしまっていいのでしょうか? 何かツールを使うと自動的に削除されるのでしょうか? 初歩的な質問なのかもしれませんが、ご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • linuxで危険なコマンド操作が知りたいです

    RedHat9で、rootユーザでcp /usr/lib/libxxxx.s* /lib とした時にcannot・・とか見慣れないエラーが 表示され、何でコピーできないのかと何度もやっていると、いつの間にか/usr/libがディレクトリごと消えていることが発覚しました。。 その前にrmコマンドも使いましたが-rfオプションをつけていなかったので、ディレクトリ内全てとかディレクトリごと消えることはないと思うのですが(T_T) とりあえずOSは立ち上がりますが、いろんなサーバが起動しなったので、OS再インストールしようと思いますが、又同じ事を繰り返したくないので、注意するコマンド操作があったら知りたいです。

  • installコマンド

    ftpユーザーを作成するのになぜ install -m 111 -o root -g wheel /bin/ls /home/ftp/bin のようにlsコマンドを/home/ftp/binの配下にリンクさせる必要があるのでしょうか? ご存知の方よろしくお願いします。

  • MySqlの初期設定 RedhatLinux9

    RedhatLinux9 で アパッチ、PHP, Mysql、FTPをインストール時に選択してインストール(Webサーバーに必要な最小限)したのですが、MySqlがどうしてもうまく動いてくれません。 Mysqlに関して、 いろいろGoogleやらOKWEBなどで調べたのですが、うまく動かないようです。 /var/lib/mysql で設定されているようで、 sqlをスタートさせると下記のようなメッセージがでます。 [root@www mysql]# /usr/bin/safe_mysqld & [1] 2214 [root@www mysql]# Starting mysqld daemon with databases from /var/lib/mysql 031023 13:54:59 mysqld ended [1]+ Done /usr/bin/safe_mysqld となり、 次にmysqlのユーザーを作ろうとするとエラーがでてしまします。 mysql_install_db --user=mysql と入力すると 下記のようなエラーがでます。 /usr/bin/mysqladmin -u root password '*****' /usr/bin/mysqladmin: connect to server at 'localhost' failed error: 'Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)' Check that mysqld is running and that the socket: '/var/lib/mysql/mysql.sock' exists! /var/lib/mysql/mysql.sock は、存在しているのですが、、、、、 sqlに関しては、 mod_auth_mysql-1.11-12 php-mysql-4.2.2-17 mysql-3.23.54a-11 mysql-server-3.23.54a-11 が、インストールされているようです。 どうしても解決できないのです。 よろしくお願いします。

  • Tomcatのシャットダウンについて

    こんにちは。 Tomcatのシャットダウンについて質問があるのですが、 起動するときはtomcat-bin-startup.shコマンドで起動するのですが、 シャットダウン時にtomcat-bin-shutdown.shコマンドを入力しても ----------------------------------------------------------- [root@java bin]# sh shutdown.sh Guessing TOMCAT_HOME from tomcat.sh to ./.. Setting TOMCAT_HOME to ./.. Using classpath: ./../lib/ant.jar:./../lib/crimson.jar:./../lib/jasper.jar:./../ lib/jaxp.jar:./../lib/servlet.jar:./../lib/test:./../lib/webserver.jar Stop tomcat [root@java bin]# ------------------------------------------------------------------- となるのですが、Tomcatのデフォルトページにアクセスしてもデフォルトページ が表示されます。 Tomcatのシャットダウンというのはこういうものなのでしょうか? 自分は、shutdown.shを実行すると、startup.shでTomcatを起動するまで、Tomcatのデフォルトページにアクセスしてもページが表示されないと思ったのですが、これは間違いなのでしょうか? 私の環境は OS:RedHatLinux7.2 JDK:1.3.0_02 Tomcat:ver3.2.4 です。 ちなみにTomcatはバイナリ版でインストールしました。 もし、何か分かることがありましたら、ご教授御願い致します。

    • ベストアンサー
    • Java