5

在linux上使用g++编译C++程序时,如何链接自己的头文件?

例如,我有一个包含以下内容的文件:

#include <stdlib.h>
#include <GL/glut.h>
#include <math.h>
#include <stdio.h>
#include "3DCurve.h"

当我使用以下命令编译时:

 g++ -lm -lglut -lGL -o 3dcurve Example_8_1.cpp

我收到以下错误:

undefined reference to 'draw3Dcurve(double, double, double, double, double, double)'

如何将 3DCurve.h 文件链接到编译器?头文件及其实现与我正在编译的文件位于同一文件夹中。我的理解是编译器应该找到它,如果它位于同一个文件夹中。

我没有得到什么?

4

3 回答 3

7

一个不链接到头文件,一个只是包含它们。但是如果头文件有对应的实现文件,你要么必须将它包含在编译行中,要么制作一个目标文件,并将其包含在编译行中。从您的错误来看,您的实现文件似乎没有得到适当的处理。

假设如果DCurve.h调用了实现,3DCurve.cpp那么您可以这样做:

g++ -lm -lglut -lGL -o 3dcurve 3DCurve.cpp Example_8_1.cpp

其他选项是使用g++ 选项创建一个目标文件,然后3DCurve.o-c

g++ -lm -lglut -lGL -o 3dcurve 3DCurve.o Example_8_1.cpp

或者,创建一个共享或静态库并像使用另一个第三方库一样使用它。

于 2012-04-29T07:47:24.713 回答
3

编译器不会“只找到”实现。

您已经包含了 header 3DCurve.h,并且 GCC 使用搜索路径找到它:

GCC 首先在包含当前文件的目录中查找使用 #include "file" 请求的头文件,然后在 -iquote 选项指定的目录中查找,然后在相同的位置查找使用尖括号请求的头文件。

对于实现3DCurve.cpp,您必须在命令中编译并链接它,例如:

 g++ Example_8_1.cpp 3DCurve.cpp -o 3dcurve -lm -lglut -lGL
于 2012-04-29T09:41:57.507 回答
0

您的代码中出现链接错误

undefined reference to 'draw3Dcurve(double, double, double, double, double, double)'

draw3Dcurve这是因为,编译器在链接目标文件时无法找到 的定义。编译时,包括具有实现的库或目标文件,draw3Dcurve它将正常工作。

于 2012-04-29T08:09:42.807 回答