编译c ++时链接自定义头文件

时间:2012-04-29 07:44:30

标签: c++ compilation header linker glut

使用g ++在linux上编译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文件链接到编译器?头文件及其实现与我正在编译的文件位于同一文件夹中。我的理解是编译器应该找到它,如果它位于同一个文件夹中。

我没有得到什么?

3 个答案:

答案 0 :(得分:6)

一个不链接到头文件,一个只包含它们。但是,如果头文件具有相应的实现文件,则必须将其包含在编译行中,或者从中创建一个目标文件,并将其包含在编译行中。从您的错误中,您看起来有一个尚未正确处理的实现文件。

假设在DCurve.h被调用3DCurve.cpp时实施,那么你可以这样做:

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

其他选项是使用3DCurve.o g ++选项制作对象文件-c,然后

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

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

答案 1 :(得分:2)

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

您已添加标题3DCurve.h,GCC使用search path找到它:

  

GCC首先在#include“file”中查找请求的标头   包含当前文件的目录,然后在目录中   由-iquote选项指定,然后在它将具有的相同位置   寻找尖括号请求的标题。

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

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

答案 2 :(得分:0)

您的代码中出现链接错误

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

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