Windows版インテルコンパイラ(icl)でのmakefile書き換え

このQ&Aのポイント
  • Win版インテルコンパイラ(icl)を使用するためのmakefile書き換え方法について
  • makefileの書き換えにより、Windowsでのインテルコンパイラ(icl)の利用ができなくなってしまった場合のエラーメッセージについて
  • コマンドプロンプトで特殊マクロを使用できない場合の対処方法について
回答を見る
  • ベストアンサー

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: 特殊マクロは定義されていません : '$<' です。 {}の括弧を()に修正したのも似たエラーが発生したからなのですが、 コマンドプロンプトだと特殊マクロは使えないのでしょうか?

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1622/5659)
回答No.1

>{}の括弧を()に修正したのも似たエラーが発生したからなのですが、 >コマンドプロンプトだと特殊マクロは使えないのでしょうか? 前回もいいましたが「コマンドプロンプト」は関係ありません。 makeは結構方言がありますので、他のmakeでは使えていた $< が nmakeでは使えないなどふつうにありえます。 nmakeの仕様を確認してください。

toupo501
質問者

お礼

nmakeの仕様を確認しましたが解決には至りませんでした。 ですがインテルコンパイラはnmakeを使う必要があると勘違いしていたこともあり、GNUのmakeを使うと無事コンパイルができました。 またmakeには様々な方言があるという情報はすごいためになりました。 前回、今回と回答ありがとうございました。

その他の回答 (1)

  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

nmake 縛りがあるなら仕方ないですが、素直に make (GNU make とか) インストールした方が話が早いんじゃないでしょうか

toupo501
質問者

お礼

インテルコンパイラはnmakeを使う必要があると勘違いしていました。 GNUmakeを使うと無事コンパイルができました。 回答ありがとうございした。

関連するQ&A

  • win版インテルコンパイラnmakeの括弧について

    linux版インテルコンパイラ(icc)を使っているmakefileをwindows版インテルコンパイラ(icl)で使えるように書きかえているのですが、コマンドプロンプトでどうもnmakeがうまくいきません。 nmakeをしたときのエラーメッセージは、 makefile(22) : fatal error U1001: 構文エラー : 無効な文字 '{' がマクロ中にありま す。 です。makefile22行目は $(PROGRAM) : ${OBJS} $(CC) $(CFLAGS) -o $@ ${OBJS} $(LIBS) なのですが、コマンドプロンプトで{}の括弧は使えないのでしょうか。 またうまくいくようにするにはどうすればよろしいでしょうか。

  • 複数のサブディレクトリを一緒に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言語の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)

  • ilink32について。'__setargv__'と'__turboFloat__'が未解決

    WindowsXP+bcc32+ilink32でGLUTを使ったプログラムを書いています。 bccの設定はsetbcc.exe(http://www.cmagazine.jp/setbcc.html)を使いました。 opengl32.lib, glu32.lib, glut32.libはimplib.exe(http://blog.jyoken.net/?eid=478291)を使って作成しました。 以上の設定でbcc32付属のMakeを使ってmakeしたところ、 コンパイル後のリンクで以下のようなエラーが出てしまい困っています。 どなたか解決法を教えていただけないでしょうか? よろしくお願いします。 --------------------- エラーの内容 --------------------- Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland Error: 外部シンボル '__setargv__' が未解決(root が参照) Error: 外部シンボル '__turboFloat' が未解決(root が参照) --------------------- --------------------- 使用しているMakefile --------------------- CC = bcc32 LINKER = ilink32 SRCS = main.c callback.c Task.c Logger.c OBJS = $(SRCS:.c=.obj) TARGET = main.exe CFLAGS = -wall -O2 LFLAGS = LIBS = opengl32.lib glu32.lib glut32.lib INCLUDE = -I"C:\borland\bcc55\Include" LIB = -L"C:\borland\bcc55\Lib" all: $(TARGET) .SUFFIXES : .obj .c .c.obj: $(CC) $(CFLAGS) -c $(SRCS) $(TARGET): $(OBJS) $(LINKER) $(LFLAGS) $(LIB) $(OBJS),$(TARGET),,$(LIBS) ---------------------

  • 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 $@

  • 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は間違っていないと思っているのですが・・・。 どなたか、分かる方、ご教授願います。

  • OpenCV をやってる初心者ですがOpenSURFで分からないことがあるので教えてください。

    今OpenSURFのmain.cppをいろいろいじくろうとしています。 もともとOpenSURFであった #include "surflib.h" #include "kmeans.h" #include <ctime> #include <iostream> 以外に自分でヘッダ#include "image_size_change.h"を作りました。 そこでは、入力画像を640*480のサイズに変更するのが目的です。 新しく作ったヘッダではchange_sizeとういう関数をつくります。型名はIplImage * です。 そこでmain.cppではimageを読み込むcvLoadImageの下の行に画像サイズを変更する。change_sizeを読んで 変更した画像を返してもらいます。たぶんそこは合ってる気がしますが、分からないのは実行する度に画像のサイズが 前にあったのが残ったままで2回くらい実行して(Make -f Makefile)後初めて意図通りの挙動になります。 なぜなんでしょうか?? どなたか教えて下さい。お願いします. main.cppは別に添付します。 Makefileは以下です. # Indicates compilator to use CC = g++ # Specifies compilator options CFLAGS = -O3 -Wall `pkg-config --cflags opencv` -D LINUX LDFLAGS = LDLIBS = `pkg-config --libs opencv` # Files extensions .cpp, .o SUFFIXES = .cpp .o .SUFFIXES: $(SUFFIXES) . # Name of the main program PROG = surf # Object files .o necessary to build the main program OBJS = fasthessian.o integral.o main.o surf.o utils.o ipoint.o all: $(PROG) # Compilation and link $(PROG): $(OBJS) $(CC) $(LDFLAGS) -o $(PROG) $(OBJS) $(LDLIBS) .cpp.o: $(CC) $(CFLAGS) -c $< -o $@ clean: -rm -f $(PROG) -rm -f *.o までです。 そして自分の作ったヘッダimage_size_change.hは以下です。 IplImage *change_size(IplImage *img){ IplImage *change_img=img; change_img = cvCreateImage( cvSize(img->width,img->height),IPL_DEPTH_8U, 3); cvResize(img,change_img,CV_INTER_CUBIC); return change_img; }

  • 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 (タブは消えてしまいました)

  • H8マイコンによるIRQ0割り込み処理について質問です。C言語を使って

    H8マイコンによるIRQ0割り込み処理について質問です。C言語を使っています。開発環境はUbuntu 10.04 LTS - Lucid Lynx -です。 リスト1(experiment.c)のソースプログラムをmakeコマンドでコンパイルしたのですが、リスト2のエラーメッセージが出てしまいます。ちなみに、リスト3がMakefileです。 リスト1ーーーーーーーーーーーーーーーーーーーーーーーーーー #include"3664.h" #pragma interrupt void int_irq0(void) { CLI(); IRR1 &= 0xfe; PDR5 = (PDR5++)&0x3f | (PDR5 & 0xc0); STI(); } int main() { init_led(); init_irq0(); PDR5 = (0x00 & 0x3f) | (PDR5 & 0xc0); /* PDR5 は,port5 のデータレジスタ*/ while(1){ SLEEP(); } } リスト2ーーーーーーーーーーーーーーーーーーーーーーーーーー owner@ubuntu:~/h8test$ make h8300-hms-gcc -O -mh -g -mrelax -mint32 -DH8_3664 -c -o experiment.o experiment.c h8300-hms-gcc -O -mh -g -mrelax -mint32 -DH8_3664 -c -o h8c.o h8c.c h8300-hms-gcc -O -mh -g -mrelax -mint32 -DH8_3664 -T h8_link.x -nostdlib h8_start.s \ experiment.o h8c.o -o h8exp.exe -lc -lgcc experiment.o: In function `_main': experiment.c:16: undefined reference to `_init_irq0' collect2: ld はステータス 1 で終了しました make: *** [h8exp.exe] エラー 1 リスト3ーーーーーーーーーーーーーーーーーーーーーーーーーー TARGET = h8exp.mot CFLAGS = -O -mh -g -mrelax -mint32 -DH8_3664 TOOL_PREFIX = h8300-hms- CC = $(TOOL_PREFIX)gcc LDSCRIPT = h8_link.x CRT0 = h8_start.s SRCS = experiment.c FUNC = h8c.c all : $(TARGET) $(TARGET): $(TARGET:.mot=.exe) $(TOOL_PREFIX)objcopy -O srec $(TARGET:.mot=.exe) $@ $(TARGET:.mot=.exe): Makefile $(LDSCRIPT) $(SRCS:.c=.o) $(FUNC:.c=.o) \ $(CRT0) $(LIBS) $(CC) $(CFLAGS) -T $(LDSCRIPT) -nostdlib $(CRT0) \ $(SRCS:.c=.o) $(FUNC:.c=.o) -o $@ $(LIBS) -lc -lgcc write: h8write -3664 $(TARGET) /dev/ttyS0 clean : rm -f $(TARGET) rm -f $(TARGET:.mot=.exe) rm -f $(SRCS:.c=.o) rm -f $(FUNC:.c=.o) エラー通り、ソース(experiment.c)の16行め「init_irq0()」が問題でしょうか。init で初期化しているので文法的に変でない限りステータス1で終了しないと思うのですが。予想でも結構なので解決方法を教えてください。回答よろしくお願いします。(最後に、長文になってしまいすみませんでした。)

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