使用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文件链接到编译器?头文件及其实现与我正在编译的文件位于同一文件夹中。我的理解是编译器应该找到它,如果它位于同一个文件夹中。
我没有得到什么?
答案 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
实现的库或目标文件,它将正常工作。