最近我尝试用g ++编译程序(在Ubuntu上)。通常我使用Dev-C ++(在Windows上),只要我创建一个项目并将所有必要的文件放在那里,它就可以正常工作。
编译程序时发生的错误是:
$filename.cpp: undefined reference to '[Class]::[Class Member Function]'
使用的文件如下:
带有main函数的源代码(.cpp)文件。
包含函数原型的头文件。
.cpp文件,包含每个函数的定义。
任何帮助将不胜感激。
答案 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
,请执行以下操作:
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
在上文中,请注意在编译-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()
,这对编译/链接过程没有任何问题。