制作档案:
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 $@ $(LIBDIR) $< $(LIBRARIES)
clean:
rm *.o
我有一个landscape.cpp,landscape.h,point.cpp,point.h和main.cpp文件 我在main.cpp文件中包含“point.h”,我得到了:
g ++ -Wall -I / usr / X11R6 / include / -o project -L / usr / X11R6 / lib main.cpp -lX11 -lXi -lXmu -lglut -lGL -lGLU -lm
/tmp/ccdpJ8HH.o:在函数main':
main.cpp:(.text+0x1c0): undefined reference to
Point :: Point(int,int)'中
collect2:错误:ld返回1退出状态
Makefile:15:目标'项目'的配方失败
make:*** [项目]错误1
答案 0 :(得分:2)
project: main.o landscape.o point.o
$(CC) $(CFLAGS) -o $@ $(LIBDIR) $< $(LIBRARIES)
在这里,您需要链接所有.o文件。您在此处使用的规则仅使用main.o文件。因为$<
只是第一个依赖项。 $^
应该适用于所有三个人。所以试试:
project: main.o landscape.o point.o
$(CC) $(CFLAGS) -o $@ $(LIBDIR) $^ $(LIBRARIES)
答案 1 :(得分:0)
我建议你使用更完整的Makefile。
此外,使用CXX=g++
和CXXFLAGS
代替CC
和CFLAGS
,因为您正在编译C ++,make
有特殊变量。
以下是我可以使用的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 $@ -c $< $(CFLAGS)
# Describe all the rules who do not directly create a file
.PHONY: All clean fclean re
我不确定它是否完美,但它更好。
另外,请不要忘记在All
规则之前添加项目规则,以避免在简单地调用make
时重新链接。
这样,您还可以添加漂亮的消息(例如,在%.o: %.c
规则中)。
有了这个,您只需要make re
来完全更新您的二进制文件。