文件链接与c ++ makefile

时间:2017-03-21 21:32:15

标签: c++ makefile hyperlink

制作档案:

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

2 个答案:

答案 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代替CCCFLAGS,因为您正在编译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来完全更新您的二进制文件。