链接g++中的文件

Linking files in g++

本文关键字:文件 g++ 链接      更新时间:2023-10-16

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

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

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

使用的文件如下:

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

带有函数原型的头文件。

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

任何帮助都将不胜感激。

您可能试图编译和链接,而不是仅仅编译源文件,或者不知何故忘记了什么。

变体一(所有内容都在一行中;始终重新编译所有内容(:

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

变体二(循序渐进;如果没有提供-o,gcc将重用输入文件名,并且在不链接时只更改扩展名;此变体最适合用于makefiles;允许您跳过未更改的部分(:

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(object(文件。

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

gcc的命令行应该看起来像:

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

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

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

  1. filename.cpp中:
#include <iostream>  
#include <myclass.h>  
//..source code.  
  1. 在生成文件中:
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.选项。CCD_ 15请求CCD_ 16将CCD_ 17部分之后的路径包括在搜索路径中。这样CCD_ 18就被正确地包括在内。

在缺乏更多信息(可能是来源(的情况下,很难准确地说出问题所在。所有的尝试都将是暗箭伤人。

我假设您已经声明了一个成员函数(通常在.h.hpp文件中(,但已经提交了成员函数的相应定义(通常在.cpp文件中(。

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

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

带有一个类似的cpp文件

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

注意,没有foo::y()

只要成员函数foo::y()在整个编译代码中不被引用,这就不会给编译/链接过程带来问题。