2017-03-21 15 views
0

メイクファイル:私は「点を含むてるlandscape.cpp、landscape.h、point.cpp、point.h、およびmain.cppにファイル を持ってファイルCとの連携++メイクファイル

INCLUDE = -I/usr/X11R6/include/ 
LIBDIR = -L/usr/X11R6/lib 

COMPILERFLAGS = -Wall 
CC = g++ 
CFLAGS = $(COMPILERFLAGS) $(INCLUDE) 
LIBRARIES = -lX11 -lXi -lXmu -lglut -lGL -lGLU -lm 

All: project 

project: main.o landscape.o point.o 
    $(CC) $(CFLAGS) -o [email protected] $(LIBDIR) $< $(LIBRARIES) 

clean: 
    rm *.o 

。私のmain.cppファイルで "h"を取得しています:

g ++ -Wall -I/usr/X11R6/include/-oプロジェクト-L/usr/X11R6/lib main.cpp -lX11 -lXi -lXmu -lglut -lGL -lGLU -lm /tmp/ccdpJ8HH.o:In function main': main.cpp:(.text+0x1c0): undefined reference to Point :: Point(int、int) ' collect2:エラー:ldが1の終了ステータスを返しました Makefile:15:target' projecのレシピ1

+0

実行可能ファイルをビルドする行にオブジェクトファイルを提供する必要があります。 – BoBTFish

+0

@BoBTFish私はそれがどういう意味か分かりません。 –

答えて

2

project: main.o landscape.o point.o $(CC) $(CFLAGS) -o [email protected] $(LIBDIR) $< $(LIBRARIES)

は、ここでは、すべての.oファイルをリンクする必要があります*** [プロジェクト]エラー:t」は メイクに失敗しました。ここにあるルールは、main.oファイルのみを使用します。 $<は最初の依存関係であるためです。 $^はすべて3つにする必要があります。だから、試してみてください。

project: main.o landscape.o point.o $(CC) $(CFLAGS) -o [email protected] $(LIBDIR) $^ $(LIBRARIES)

0

私はあなたがより完全なMakefileを使用することをお勧めします。あなたがC++をコンパイルするとmakeは特別な変数を持っているので

また、代わりにCCCFLAGSCXX=g++CXXFLAGSを使用しています。

私が使用できるMakefileの例です。

# Project name 
NAME=  project 

# Include directory 
INC_DIR= /usr/X11R6/include/ 

# Library directory 
LIB_DIR= /usr/X11R6/lib/ 

# Compiler 
CXX=  g++ 

# Source files 
SRC_DIR= # in case your cpp files are in a folder like src/ 

SRC_FILES= main.c  \ 
      landscape.c \ 
      point.c 

# Obj files 
OBJ=  $($(addprefix $(SRC_DIR), $(SRC_FILES)):.c=.o) 
# that rule is composed of two steps 
# addprefix, which add the content of SRC_DIR in front of every 
# word of SRC_FILES 
# And a second rule which change every ".c" extension into ".o" 

LIBS=  X11 \ 
      Xi \ 
      Xmu \ 
      glut \ 
      GL \ 
      GLU \ 
      m 

# Compilation flags 
CXXFLAGS= -Wall 

CXXFLAGS+= $(addprefix -I, $(INC_DIR)) 

LDFLAGS= $(addprefix -L, $(LIB_DIR)) \ 
      $(addprefix -l, $(LIBS)) 

# Rules 

# this rule is only linking, no CFLAGS required 
$(NAME): $(OBJ) # this force the Makefile to create the .o files 
     $(CXX) -o $(NAME) $(OBJ) $(LDFLAGS) 

All: $(NAME) 

# Remove all obj files 
clean: 
     rm -f $(OBJ) 

# Remove all obj files and the binary 
fclean: clean 
     rm -f $(NAME) 

# Remove all and recompile 
re: fclean all 

# Rule to compile every .c file into .o 
%.o: %.c 
     $(CXX) -o [email protected] -c $< $(CFLAGS) 

# Describe all the rules who do not directly create a file 
.PHONY: All clean fclean re 

私はそれが完璧だとは思っていませんが、それは良いです。 makeを呼び出すだけで、再接続を避けるために、Allルールの前にプロジェクトルールを置くことも忘れないでください。

このようにして、美しいメッセージ(たとえば、%.o: %.cルール)を追加することもできます。

バイナリを完全に更新するには、make reを実行するだけです。

関連する問題