C++ 在Makefile中未完成链接

C++ 在Makefile中未完成链接,c++,makefile,C++,Makefile,我尝试使用main.cpp、factorial.cpp、hello.cpp和function.h文件创建一个Makefile 在Linux命令窗口中键入“make”时,会显示: g++ -c -o hello main.o factorial.o hello.o g++: main.o: linker input file unused because linking not done g++: factorial.o: linker input file unused because link

我尝试使用main.cpp、factorial.cpp、hello.cpp和function.h文件创建一个Makefile 在Linux命令窗口中键入“make”时,会显示:

g++ -c -o hello main.o factorial.o hello.o
g++: main.o: linker input file unused because linking not done
g++: factorial.o: linker input file unused because linking not done
g++: hello.o: linker input file unused because linking not done
我是第一次制作这个Makefile。请给出建议可能是什么问题? Makefile包含以下代码->

hello: main.o factorial.o hello.o
        g++ -c -o hello main.o factorial.o hello.o

main.o: main.cpp
        g++ -c -o main.o main.cpp

factorial.o: factorial.cpp
        g++ -c -o factorial.o factorial.cpp

hello.o: hello.cpp
        g++ -c -o hello.o hello.cpp
要查看的单个文件内容包括: 1) main.cpp

4) 函数.h

 void print_hello();  
 int factorial(int n);

-c
g++
的参数告诉它不要链接:

-c编译或汇编源文件,但不链接。链接阶段根本没有完成。最终输出是每个源文件的对象文件形式

您肯定不希望在此处使用
-c

hello: main.o factorial.o hello.o
        g++ -c -o hello main.o factorial.o hello.o

该行中有一个错误:

    g++ -c -o hello main.o factorial.o hello.o
男人说:
。。。-c选项表示不运行链接器。


此选项仅用于生成对象文件。当它通过时,gcc将不会启动链接器来生成可执行文件或共享库。

您还可以使用规则和模式使其更通用:

SRC_DIR = ./src
OBJ_DIR = ./bin/obj
BIN_DIR = ./build/bin

# List all the sources
SRCS = A.cpp B.cpp

# Define the rule to make object file from cpp
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
    g++ -o $@ $(INCLUDES) $(CPPFLAGS) -c $^

TARGET_BIN = $(BIN_DIR)/test

all : make_dirs $(TARGET_BIN)

$(TARGET_BIN) : $(SRCS:%.cpp=$(OBJ_DIR)/%.o)
    g++ $(LDFLAGS) -o $@ $^ $(LDLIBS)

make_dirs :
    mkdir -p $(OBJ_DIR)
    mkdir -p $(BIN_DIR)
通过这种方法,您有几个好处:

  • 易于使用:您只需指定一次源文件,而不必关心每个目标文件的处理:这项工作由一条规则完成

  • 更易于维护:每次您需要更改编译器或链接器选项时,您都在单个规则中进行更改,而不是针对每个翻译单元


从以上所有答案中可以清楚地看出,由于在
g++-c-o hello main.o factorial.o hello.o
中使用了
-c
,它会阻止链接。从相应的.cpp或.h etc文件创建对象文件后,需要链接这些文件。如果没有链接,因为每个文件都是可以执行某些任务的完整程序的一部分,因为这些文件是依赖的,所以无法执行任何有用的操作。因此,我们必须将这些相关部分连接起来,才能运行完整的程序。

下面是一个基本的视频教程,用于轻松学习使用依赖项和模式规则这两种方法制作Makefile。 它以依赖方法为例,然后引入模式规则,作为生成长Makefile的更好方法



要了解编译和链接之间的区别,这可能很有用。

这比我现在使用的更好吗?(对于包含1000个文件的大型项目?@Jigyasa:当然更好,我已经更新了我的答案来解释为什么除了答案中显示的修复之外,您应该将依赖项添加到
functions.h
规则中。但是没有它,它可以正常工作。是否有任何特定的理由将依赖项添加到functions.h?因为我读过这段代码,它们没有对函数使用依赖关系。hIt实际上工作不正常。如果您更改
函数.h
并运行
打招呼
,您会希望首先重新构建所有
.o
文件。
hello: main.o factorial.o hello.o
        g++ -c -o hello main.o factorial.o hello.o
    g++ -c -o hello main.o factorial.o hello.o
SRC_DIR = ./src
OBJ_DIR = ./bin/obj
BIN_DIR = ./build/bin

# List all the sources
SRCS = A.cpp B.cpp

# Define the rule to make object file from cpp
$(OBJ_DIR)/%.o : $(SRC_DIR)/%.cpp
    g++ -o $@ $(INCLUDES) $(CPPFLAGS) -c $^

TARGET_BIN = $(BIN_DIR)/test

all : make_dirs $(TARGET_BIN)

$(TARGET_BIN) : $(SRCS:%.cpp=$(OBJ_DIR)/%.o)
    g++ $(LDFLAGS) -o $@ $^ $(LDLIBS)

make_dirs :
    mkdir -p $(OBJ_DIR)
    mkdir -p $(BIN_DIR)