(.text + 0x20):对'main'的未定义引用当试图编译.cpp文件时

时间:2014-04-22 17:08:00

标签: c++

当尝试使用名为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

我做错了什么?对不起,如果很明显。

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

你忘记了:

#define TEST_RAT

这未在您的代码中定义,因此现在应该可以使用。

答案 2 :(得分:0)

由于您将main()放在#ifdef中,如果未定义TEST_RAT,则会将其遗漏。因为它不是你没有main所以你不能创建一个可执行文件(没有入口点),g++失败并看到错误。

答案 3 :(得分:0)

很可能你想把它放在你的主要部分(以确保定义了Rat类):

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

答案 4 :(得分:0)

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

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

这会将rat.cpp编译为目标文件rat.o,而不会尝试将其链接到程序中(因此需要main)。

如果您要测试正确性,可能还需要-W-Wall进行警告。