c++ - C++链接G++中的文件

最近我尝试在G++(在ubuntu上)中编译一个程序, 通常我使用C (在Windows上)开发,只要我创建一个项目,并且把所有必要的文件放在那里,它就能正常工作。

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


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



所使用的文件如下所示:

源代码(.cpp)文件具有主要功能,

带有函数Prototype的头文件,

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

任何帮助将不胜感激。

时间:

您可能尝试编译和链接,而且不仅仅编译源文件或者忽略了某些内容。

变化1: (所有内容在一行;一直重新编译所有内容),


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



变化2: (如果没有提供 -o,gcc将重用输入文件名,并在不链接时更改扩展名):


g++ -c first.cpp


g++ -c second.cpp


g++ -c third.cpp


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



变化3: (一些占位符):

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

总体来说,除非你不需要使用任何 IDE,否则你不应该太担心它, 如果你对命令行语法不精通,先坚持使用IDE。

gcc的命令行应该类似于:


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



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

假设你已经声明了成员函数(通常在.h或.hpp文件中),但是,已经将省略的成员函数(通常在.cpp文件中)定义为,

在C++中,可以声明这样的类:


class foo {


 void x();


 void y();


}



有一个像这样的cpp文件


void foo::x() {


 do_something()


}



注意,没有 foo::y()

在编译/链接过程中,只要在编译的代码中引用了成员函数 foo::y(),就不会出现任何问题,

你还可以在filename.cpp中检查正确的#include标记, 假设filename.cpp使用myclass.h中包含的与filename.cpp相同的目录中包含的代码, 假设G++所表示的类是包含在myclass.h中,并且在myclass.cpp中定义的, 因此,要在filename.cpp中正确包含 myclass.h,请执行以下操作:

  • filename.cpp中:
  • 
    #include <iostream> 
    
    
    #include <myclass.h> 
    
    
    //..source code. 
    
    
    
    
  • 在生成文件中:
  • 
    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
    
    
    
    

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

...