gpt4 book ai didi

c++ - 尝试用 C++ 编写简单的 makefile 时不断收到错误消息?

转载 作者:行者123 更新时间:2023-11-28 06:29:48 25 4
gpt4 key购买 nike

我无法让我的 makefile 生成可执行文件。这是我的 makefile 中的代码:

CXX = g++

CXXFLAGS = -std=c++0x
CXXFLAGS += -Wall
CXXFLAGS += -pedantic-errors
CXXFLAGS += -g

LDFLAGS = -lboost_date_time

OBJS = f.o g.o lab1-2.o

SRCS = f.cpp g.cpp lab1-2.cpp

HEADERS = f.h g.h

#target: dependencies

# rule to build


lab1-2: ${OBJS} ${HEADERS}
${CXX} ${LDFLAGS} ${OBJS} -o lab1-2


${OBJS}: ${SRCS}
${CXX} ${CXXFLAGS} -c $(@: .o=.cpp)

当我调用“make”时,会发生以下情况:

g++ -std=c++0x -Wall -pedantic-errors -g -c f.o;
g++ -std=c++0x -Wall -pedantic-errors -g -c g.o;
g++ -std=c++0x -Wall -pedantic-errors -g -c lab1-2.o;
"linker input file unused because linking not done"

我不确定这条消息(以上)是什么意思,我该如何解决?谢谢!

最佳答案

问题是 -c 标志告诉编译器前端 (g++) 它应该将源文件编译成目标文件,然后停止。但是,您向编译器提供了目标文件(f.og.olab1-2.o),而不是源文件。所以编译器告诉您它忽略了那些目标文件,因为您正在编译 (-c) 而不是链接。

您的 makefile 有问题。例如:

${OBJS}: ${SRCS}
${CXX} ${CXXFLAGS} -c $(@: .o=.cpp)

不是你想要的。首先,您不能在这样的模式引用中的 : 之后添加空格。 Make 对某些类型的空格非常讲究(实际上,所有计算机工具都是如此)。如果手册中的示例没有空格,则最好不要添加任何空格(反之亦然)。你想说 $(@:.o=.cpp) (没有空格)。然后你的编译行将包含源文件:f.cpp, g.cpp) 而不是目标文件。

其次,如果你展开你得到的变量:

f.o g.o lab1-2.o: f.cpp g.cpp lab1-2.cpp

这与写作相同:

f.o: f.cpp g.cpp lab1-2.cpp
g.o: f.cpp g.cpp lab1-2.cpp
lab1-2.o: f.cpp g.cpp lab1-2.cpp

也就是说,无论何时更改任何源文件,所有目标文件都将被重建。那不是你想要的。此外,由于您没有在此处列出任何头文件,这意味着这些目标文件都不会因为您更改了头文件而被重建。

最后,你有这个:

lab1-2: ${OBJS} ${HEADERS}

您将头文件列为可执行文件的先决条件,这是不正确的:当头文件更改时您没有重新链接可执行文件,而是重新编译源文件。

你想要这样的东西:

lab1-2: ${OBJS}
${CXX} ${LDFLAGS} ${OBJS} -o lab1-2

$(OBJS): $(HEADERS)

%.o: %.cpp
${CXX} ${CXXFLAGS} -c -o $@ $<

当然,GNU make 有内置的规则可以为你做所有这些,所以你可以这样写:

lab1-2: ${OBJS}

$(OBJS): $(HEADERS)

得到相同的结果。

关于c++ - 尝试用 C++ 编写简单的 makefile 时不断收到错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27831024/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com