makefileの書き方
- UNIX環境でC言語のプログラムをコンパイルする方法について
- makefileを使用してインクルードディレクトリの指定を行った場合に無視される問題について
- makefileでロードモジュールを作成する際に発生する質問の問題について
- ベストアンサー
makefileの書き方
UNIX環境でC言語で作成したプログラムのコンパイルをmakefileを使用して行いたいのですが、 インクルードディレクトリの指定が無視されてしまいます。(CFLAG2の-o $@も) 何が問題なのでしょうか? ファイルの構成としてはとりあえず全て同じディレクトリに格納しています。 (3)だけであればインクルードディレクトリの指定等は問題なく展開され、 オブジェクトができあがります。 (1)(2)でロードモジュールを作成しようとすると質問の問題が発生します。 # CC = cc CFLAGS = -Aa -O -g -Y -D_HPUX_SOURCE CFLAGS2 = -o $@ -c # INCDIR = . SRCDIR = . OBJDIR = . INCLUDE = -I$(INCDIR) OBJS = TestMain.o MODULE = $(OBJDIR)/TestMain all: $(MODULE) ・・・・・(1) $(MODULE): $(OBJS) ・・・・・(2) $(CC) -o $@ $^ $(OBJDIR)/TestMain.o: $(SRCDIR)/TestMain.c $(SRCDIR)/TestCommon.c ・・・・・(3) $(CC) $(INCLUDE)/ $(CFLAGS) $(CFLAGS2) $(SRCDIR)/TestMain.c $(SRCDIR)/TestCommon.c (タブは消えてしまいました)
- xenoarcs
- お礼率63% (49/77)
- C・C++・C#
- 回答数5
- ありがとう数4
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
「UNIX環境」と書いてありますが、HP-UXですか、他のOSですか? makefileの最後の行は、一度に二つのC言語ソースファイルから、一つのオブジェクトをコンパイルしようとしていますね。これは本当に可能でしょうか。HP-UXのCコンパイラは分からないのですが。 察するに、(3)だけのときオブジェクトができあがったというのは、TestMain.cだけコンパイルされたということではないでしょうか。 試しに OBJS = TestMain.o の行を OBJS = TestMain.o TestCommon.o に変更して、 最後の一行を $(OBJDIR)/TestMain.o: $(SRCDIR)/TestMain.c $(CC) $(INCLUDE) $(CFLAGS) $(CFLAGS2) $(SRCDIR)/TestMain.c $(OBJDIR)/TestCommon.o: $(SRCDIR)/TestCommon.c $(CC) $(INCLUDE) $(CFLAGS) $(CFLAGS2) $(SRCDIR)/TestCommon.c の4行に置き換えてみてはいかがでしょう。 (タブは全角スペースで表現しています)
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
HP-UX の make には -p ってオプションはないんでしょうか?
お礼
回答ありがとうございます。 -pのオプションはありました。 とりあえず一旦簡単なmakefileに立ち返り 確認することで動作させることができました。
- wormhole
- ベストアンサー率28% (1619/5653)
>よくわからないmakefileを載せたことで混乱を招いているような気がします・・・。 これは確実に載せた方がいいです。 症状だけ書かれても回答者側で元のMakefileがどのように書かれていたのか予想しないといけませんし、その想像が合ってるとは限りませんから。
- wormhole
- ベストアンサー率28% (1619/5653)
makeによるのかもしれないですが TestMain.o と ./TestMain.o は別扱いじゃないのかなぁ
お礼
回答ありがとうございます。 そのあたりも意識して書いてみます。
- Tacosan
- ベストアンサー率23% (3656/15482)
「インクルードディレクトリの指定が無視されてしまいます」 とか 「CFLAG2の-o $@も」 とか書いてあるけど, 具体的には「どのようにしたいところどのようになった」ことを「無視されてしまう」と言っているんでしょうか?
お礼
回答ありがとうございます。 自分でもよく分かっていないだけに質問も分かりにくくなってしまい申し訳ありません。 やりたいことは、以下のようなファイル構成でロードモジュールを作成できるmakefileを作ることです。 ・TestMain.c メイン関数を持つソース ・TestMain.h 上記ヘッダ ・TestCommon.c 共通関数を持つソース ・TestCommon.h 上記ヘッダ ・TestDefine.h 共通定義を持つヘッダ makeして展開された内容を確認すると、 (1)(2)があるとき、 (3)の「$(INCLUDE)/」に相当する部分と 「 $(CFLAGS2) 」内の「-o $@」に相当する部分がありません。 よろしくお願いします。
関連するQ&A
- makefile の書き方
OBJS1 = a.o b.o c.o OBJS2 = d.o e.o f.o OBJS1のそれぞれの元のソースコードと OBJS2のそれぞれに元のソースコードを 違うコンパイルオプションでオブジェクトファイルを作りたいのですが、 間単に書ける方法があれば教えてください。 つまり、以下を簡単に書く方法です。 よろしくお願いします。 a.o: a.c ${CC} ${CFLAGS_1} $< -o $@ b.o: b.c ${CC} ${CFLAGS_1} $< -o $@ c.o: c.c ${CC} ${CFLAGS_1} $< -o $@ d.o: d.c ${CC} ${CFLAGS_2} $< -o $@ e.o: e.c ${CC} ${CFLAGS_2} $< -o $@ f.o: f.c ${CC} ${CFLAGS_2} $< -o $@
- ベストアンサー
- 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#
- 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#
- 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#
- 複数のサブディレクトリを一緒にmakeして一つの実行ファイルを作成するには
いま、Linuxの環境でC言語の勉強しています。 それで、makeを使ってコンパイル方法を調べているのですが、 ソースディレクトリとヘッダーディレクトリを分けて管理している場合に一緒にコンパイルさせる為のMakefileの書き方が分からず困っています。 現在は、同じディレクトリ内にソースファイルとヘッダーファイルが存在してます。ちなみに下記が今のMakefile内容です。 ご存知の方が記述方法もしくは参考サイトを教えて頂けますでしょうか。よろしくお願い致します。 ======================================================== program = test_pro objs = main.o test1.o test2.o CC = gcc CFLAGS = -g -Wall #suffixes_define_rule .SUFFIXES : .c .o $(program) : $(objs) $(CC) $(CFLAGS) -o $@ $^ #suffixes_rule .c.o : $(CC) $(CFLAGS) -c $< .PHONY : clean clean : $(RM) $(objs) #header_depend test1.o : test1.h test2.o : test2.h =====================================================
- ベストアンサー
- C・C++・C#
- win版インテルコンパイラnmakeについて
linux版インテルコンパイラ(icc)を使っているmakefileをwindows版インテルコンパイラ(icl)で使えるように書きかえているのですが、コマンドプロンプトでどうもnmakeがうまくいきません。 元のmakefileは、 CC = icc CFLAGS = -O3 -xSSE4.2 CFLAGS2 = $(CFLAGS) -openmp -openmp-report1 LIBS = -lm -liomp5 PROGRAM = foo.exe SRCS = foo1.c foo2.c foo3.c .c.o: $(CC) $(CFLAGS) -c $< .SUFFIXES: .c .o all : $(PROGRAM) $(PROGRAM) : ${OBJS} $(CC) $(CFLAGS) -o $@ ${OBJS} $(LIBS) foo1.o : foo1.c foo.h foo2.o : foo2.c foo.h $(CC) $(CFLAGS2) -c $< foo3.o : foo3.c foo.h clean: rm *.o rm $(PROGRAM) で、書き換えたmakefileは、 CC = icl CFLAGS = -O3 -QxSSE4.2 CFLAGS2 = $(CFLAGS) -Qopenmp # CFLAGS = -W -O3 LIBS = -lm -liomp5 PROGRAM = foo.exe SRCS = foo1.c foo2.c foo3.c .c.o: $(CC) $(CFLAGS) -c $< .SUFFIXES: .c .o all : $(PROGRAM) $(PROGRAM) : ${OBJS} $(CC) $(CFLAGS) -o $@ $(OBJS) $(LIBS) foo1.o : foo1.c foo.h foo2.o : foo2.c foo.h $(CC) $(CFLAGS2) -c $< foo3.o : foo3.c foo.h clean: rm *.o rm $(PROGRAM) です。(投稿の際に見づらかったためスペースや改行はいじってます) CFLAGS2の-openmpを-Qopenmpにしたのと $(PROGRAM)の行の${OBJS}を$(OBJS)にしたぐらいですがエラーが発生します。({}括弧を使っているとエラーが発生したため) エラーメッセージは NMAKE : warning U4006: 特殊マクロは定義されていません : '$<' です。 {}の括弧を()に修正したのも似たエラーが発生したからなのですが、 コマンドプロンプトだと特殊マクロは使えないのでしょうか?
- ベストアンサー
- 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のファイルの中身は問題ありません。 他のパソコンではキチンとコンパイルに成功しています。 ちなみに、"make test"と実行して出てくるエラーメッセージが「makefile:3 *** 最初のターゲットより前にコマンドを起動. 中止.」 です。
- ベストアンサー
- 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のファイルの中身は問題ありません。 他のパソコンではキチンとコンパイルに成功しています。
- ベストアンサー
- Linux系OS
- 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#
- 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
お礼
回答ありがとうございます。 OSはHP-UXです。 試行錯誤する中でご指摘のような構成でも試したのですが、 他の方の情報も合わせてもう一度やってみます。 ファイル構成や、やりたいことはNo.1の方のお礼に書いたとおりです。 よくわからないmakefileを載せたことで混乱を招いているような 気がします・・・。