c++ - Makefile 和嵌套的头文件

标签 c++ g++ makefile

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

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

所以我在 Internet 上搜索了一个线程,上面说如果你有包含头文件的头文件。您必须将这些添加到先决条件中,并且没有办法解决这个问题。

Basic Makefile and header dependencies

所以我尝试了这个,但我的情况有点不同,因为我的嵌套 header 也有 .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 作为参数,所以这个命令基本上意味着:

build program main.o from objects 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/

相关文章:

c++ - 在函数定义中使用 enable_if 进行模板特化

c++ - C++ 程序执行错误 : static executable calls DLL library

c++ - 为什么这个简单的 makefile 不在更改时重建源代码?

macos - Tomcat 连接器 (mod_jk) 出错

java - ANTLR Ubuntu Java Makefile

c++ - 使用带有 lambdas/bind 的成员函数实现中间件函数

c++ - 程序以Visual Studio代码结束后,如何停止Task运行终端自动退出?

c++ - 如何初始化或将中文赋给wstring?

c++ - 修复了 g++ 4.9.1 奇怪的 "%a"格式行为?

c++ - 传递参数的 g++ 问题