【发布时间】:2019-05-27 17:42:16
【问题描述】:
我的问题是要运行一个 makefile 我是新手,因为通常我只是从终端编译或使用我的 IDE。
所以我的问题可能是嵌套的标题依赖项。我有包含头文件的文件,这些头文件具有头文件。所有这些头文件都有一个 .cpp 文件。
所以我在互联网上搜索了一个帖子,说如果你有包含头文件的头文件。您必须将这些添加到先决条件中,并且没有办法解决这个问题。
Basic Makefile and header dependencies
所以我尝试了这个,但我的情况有点不同,因为我的嵌套标题也有 .cpp 文件。所以我尝试将那些添加到不起作用的食谱位置。因此,我尝试将必要的 .cpp 文件添加到必备位置。那也没用。
1 OBJECTS = main.o MovementHandle.o Cursor.o PromptHandle.o \
2 Prompt.o NcursesOptions.o RT_Error.o Video.o Frame.o RGB.o
3
4 CXXFLAGS = -std=c++17 -c
5 LIBS = -lncurses
6
7 drawterm : $(OBJECTS)
8 g++ -o $(OBJECTS) $(LIBS)
9
10 main.o : main.cpp MovementHandle.o PromptHandle.o
11 g++ $(CXXFLAGS) main.cpp
12
13 MovementHandle.o : MovementHandle.cpp MovementHandle.h Cursor.o
14 g++ $(CXXFLAGS) MovementHandle.cpp
15
16 Cursor.o : Cursor.cpp Cursor.h
17 g++ $(CXXFLAGS) Cursor.cpp
18
19 PromptHandle.o : PromptHandle.cpp PromptHandle.h Prompt.o Video.o
20 g++ $(CXXFLAGS) PromptHandle.cpp
21
22 Prompt.o : Prompt.cpp Prompt.h Cursor.o NcursesOptions.o
23 g++ $(CXXFLAGS) Prompt.cpp
24
25 NcursesOptions.o : NcursesOptions.cpp NcursesOptions.h RT_Error.o
26 g++ $(CXXFLAGS) NcursesOptions.cpp
27
28 RT_Error.o : RT_Error.cpp RT_Error.h
29 g++ $(CXXFLAGS) RT_Error.cpp
30
31 Video.o : Video.cpp Video.h Frame.o
32 g++ $(CXXFLAGS) Video.cpp
33
34 Frame.o : Frame.cpp Frame.h RGB.o
35 g++ $(CXXFLAGS) Frame.cpp
36
37 RGB.o : RGB.cpp RGB.h
38 g++ $(CXXFLAGS) RGB.cpp
所以我一直得到这个,我知道这意味着:
/usr/bin/ld: /usr/lib/gcc/x86_64-pc-linux-gnu/8.3.0/../../../../lib/Scrt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status
make: *** [makefile:8: drawterm] Error 1
这意味着 make 找到了一个我还没有正确编译的文件,这意味着 make 假设它有一个
int main()
{
return 0;
}
在其中但没有找到它,因为它不打算被这样解释。
【问题讨论】:
-
我刚刚发现这说明我可以在我的先决条件中包含 .o 文件。我要测试一下。 stackoverflow.com/questions/15440183/makefile-include-header
-
一些可能有帮助的阅读:makefile dependency generation 和 Auto-Dependency Generation
-
我尝试阅读它,但我对 makefile 了解不足,无法知道如何设置包括 .d 文件。所以运行后:g++ -std=c++17 -MD *.cpp *.h -lncurses。我不知道该怎么办。