C++ 在Makefile中未完成链接
我尝试使用main.cpp、factorial.cpp、hello.cpp和function.h文件创建一个Makefile 在Linux命令窗口中键入“make”时,会显示: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
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)