用g ++链接文件

时间:2011-06-30 09:00:32

标签: c++ g++ compiler-errors linker-errors

最近我尝试用g ++编译程序(在Ubuntu上)。通常我使用Dev-C ++(在Windows上),只要我创建一个项目并将所有必要的文件放在那里,它就可以正常工作。

编译程序时发生的错误是:

$filename.cpp: undefined reference to '[Class]::[Class Member Function]'

使用的文件如下:

带有main函数的源代码(.cpp)文件。

包含函数原型的头文件。

.cpp文件,包含每个函数的定义。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:24)

您可能尝试编译和链接,而不仅仅是编译源文件或以某种方式忘记了某些内容。

变体一(一行中的所有内容;一直重新编译所有内容):

g++ -o myexecutable first.cpp second.cpp third.cpp [other dependencies, e.g. -Lboost, -LGL, -LSDL, etc.]

变体二(一步一步;如果没有提供-o,gcc将重复使用输入文件名,只在未链接时更改扩展名;此变体最适用于makefile;允许您跳过未更改的部分):

g++ -c first.cpp
g++ -c second.cpp
g++ -c third.cpp
g++ -o myexecutable first.o second.o third.o [other dependencies]

变体三(一些占位符):

不会列出它,但上面提到的参数也可能是占位符,例如g++ -c *.cpp会将当前目录中的所有cpp文件编译为o(bject)同名文件。

总的来说,除非你真的必须在没有任何IDE的情况下工作,否则你不应该太担心它。如果您不熟悉命令行语法,请首先坚持使用IDE。

答案 1 :(得分:2)

gcc的命令行应如下所示:

g++ -o myprogram class1.cpp class2.cpp class3.cpp main.cpp

检查哪个cpp文件定义了缺少的类成员函数。你可能还没有把它交给gcc。

答案 2 :(得分:0)

您还可以在#include中查看正确的filename.cpp代码。假设filename.cpp使用与myclass.h在同一目录中的filename.cpp中包含的代码。假设g ++所说的类未定义,包含在myclass.h中并在myclass.cpp中定义。因此,要在myclass.h中正确包含filename.cpp,请执行以下操作:

  1. filename.cpp
  2. #include <iostream>  
    #include <myclass.h>  
    //..source code.  
    
    1. 在makefile中:
    2. filename.o: myclass.C myclass.h filename.cpp
      g++ -I./ -c filename.cpp -o filename.o
      
      myclass.o: myclass.C myclass.h  
      g++ -c myclass.C -o myclass.o
      

      在上文中,请注意在编译-I.时使用filename.cpp选项。 -I<directory>要求g++-I部分后面的路径包含在搜索路径中。这样就正确地包含了myclass.h

      如果没有更多信息(可能是来源),很难准确地说出问题所在。所有的尝试都会在黑暗中被刺伤。

答案 3 :(得分:0)

我假设你已经声明了一个成员函数(通常在.h.hpp文件中)但是已经省略了成员函数的相应定义(通常在.cpp文件中)

在c ++中,可以像这样声明一个类:

class foo {
  void x();
  void y();
}

使用类似的cpp文件

void foo::x() {
   do_something()
}

注意,没有foo::y()

只要在编译代码中没有引用成员函数foo::y(),这对编译/链接过程没有任何问题。