(.text+0x20):尝试编译文件时未定义对"main".cpp引用

(.text+0x20): undefined reference to `main' When trying to Compile .cpp file

本文关键字:未定义 main 引用 cpp 文件 text+0x20 编译      更新时间:2023-10-16

当试图用位于不同文件夹中的名为normalize的.h文件编译名为rat的.cpp文件时(rat.h与rat.cpp在同一文件夹中),我正在键入

g++ -I/opt/cis/include/ -I/opt/cis/lib/ rat.cpp

我在.cpp文件本身中包含了一个int main(),并完全注释掉了.h文件和.cpp文件的内部工作,只是为了尝试正确编译。

.h文件(不包括注释项目)

  1 #ifndef RAT_H
  2 #define RAT_H
  3 #include <iostream>
  4 #include <string>
  5 
  6 class Rat {
  7         friend std::ostream &operator<<(std::ostream &, const Rat &);
  8         friend std::istream &operator>>(std::istream &, Rat &);
  9         private:
 10                 double n,d;
 11         public: 
 12                 Rat(): n(0), d(1) {}
 13 };
 14. #endif

.cpp文件

  1 #include <iostream>
  2 #include <cstdlib>
  3 #include <string>
  4 #include <sstream>
  5 #include "rat.h"
  6 #include "normalize.h"
  7 using namespace std;
  8 #ifdef TEST_RAT
  9 int main() {};
  10 #endif

我做错了什么?很抱歉,如果这是显而易见的。

只有定义了宏TEST_RAT时,main函数才存在。任一:

  • -DTEST_RAT添加到编译器CFLAGS
  • #ifdef之前添加行#define TEST_RAT
  • 在.cpp中删除#ifdef TEST_RAT#endif

您忘记了:

#define TEST_RAT

这在您的代码中没有定义,所以现在应该可以工作了。

由于您将main()放在#ifdef中,因此如果未定义TEST_RAT,则会忽略它。由于没有main,因此无法创建可执行文件(没有入口点),g++失败并显示错误。

很可能您想把它放在main中(以确保Rat类已定义):

    #ifdef RAT_H
    int main() {};
    #endif

另一个选项是-c标志:,因为还没有人提到它

g++ -c -I/opt/cis/include/ -I/opt/cis/lib/ rat.cpp

这将把rat.cpp编译为对象文件rat.o,而不需要试图将其链接到程序中(因此需要main)。

如果您正在测试正确性,您可能还想尝试-W-Wall以获得警告。