amazon

28.2.11

Makefileでmakeするときに、g++でコンパイルしたのにccになってしまう現象



Cで作っていたプログラムをC++に変えてみたところ、
Makefileでmakeするときに、g++でコンパイルしたのにccになってしまった。

結論から言うと、main.c -> main.cpp に変えたのは良いのだが、
main.cを残しておくとエラーを起こすようだ。

今回の経過は次のとおりである。

main.cでインクルードしていたfunc.hでcppの関数を使いたかったので、
main.cとfunc.cをmain.cppにfunc.cppに変えた。
main.cとmain.cppは同じ内容である。
func.hにはをインクルードした。

こんなMakefileを作ってmakeしてみた。
# Makefile

# ターゲット(プログラム)名とオブジェクトファイル名
target = a.exe
srcs = main.cpp
objs = $(srcs:%.cpp=%.o)

# 定義済みマクロの再定義
CXX = g++
CXXFLAGS = -g -Wall

# サフィックスルールの適応対象の拡張子の定義
.SUFFIXES: .cpp .o

# プライマリターゲット
$(target): $(objs)
$(CXX) -o $@ $^

# サフィックスルール
.cpp.o:
$(CXX) -c $<

# ファイル削除用ターゲット
.PHONY: clean
clean:
$(RM) $(target) $(objs)

すると、次のエラー。

$ make
cc -c -o main.o main.c
In file included from main.c:3:
func.h:7:20: error: iostream: No such file or directory
make: *** [main.o] Error 1

念のためターミナルに直接コマンドを打つとエラーは起きない。

$ g++ -o a.exe main.cpp
$

エラーをよく見てみると、
コンパイラを$(CXX)に指定しているのに、ccでコンパイルしている。
ちなみに、CXXの中身はg++である。
さらに、よく見てみると!?main.oの後がmain.cになっている。

makeでコンパイルされたのは、main.cppではなく、main.cを自動的にccでコンパイルしていることが分かった。
main.cを削除してmakeしたら無事成功した。

0 件のコメント:

コメントを投稿