我的问题是让makefile运行,这是我的新手,通常是从终端编译或使用我的IDE。

所以我的问题可能是嵌套标头依赖性。我有包含头文件的文件,这些头文件的头文件具有头文件。所有这些头文件都有一个.cpp文件。

因此,我在Internet上搜索了一个线程,该线程表示如果您的头文件包含头文件。您必须将这些添加到必备组件中,并且无法解决此问题。

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;
}


在它里面,但是找不到它,因为它不打算这样解释。

最佳答案

我认为这是下等线:

    g++ -o $(OBJECTS) $(LIBS)


扩展$(OBJECTS)时,它变为(可能是因为您未显示OBJECTS变量的声明):

    g++ -o main.o MovementHandle.o Cursor.o ...


-o选项将main.o视为参数,因此该命令的基本含义是:


  从对象main.o构建程序MovementHandle.o ...


您很可能需要将其更改为以下内容:

    g++ -o $@ $(OBJECTS)
    # $@ resolves to target, which in your case will be name of executable you want

关于c++ - Makefile和嵌套头,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56265361/

10-16 04:51