【问题标题】:Linking custom header files when compiling c++编译 C++ 时链接自定义头文件
【发布时间】:2025-12-09 18:00:01
【问题描述】:

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

我没有得到什么?

【问题讨论】:

  • 另外,将库放在命令行中的对象和源文件之后,否则可能会遇到麻烦,具体取决于 GCC 的版本。

标签: c++ compilation header linker glut


【解决方案1】:

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

假设实现如果 DCurve.h 被称为 3DCurve.cpp 那么你可以这样做:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    您已包含标头 3DCurve.h,GCC 使用 search path 找到它:

    GCC 会在 包含当前文件的目录,然后在目录中为 由 -iquote 选项指定,然后在相同的位置 查找使用尖括号请求的标头。

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

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

    【讨论】:

      【解决方案3】:

      您的代码中出现链接错误

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

      这是因为,编译器在链接目标文件时无法找到draw3Dcurve 的定义。编译时,包含实现draw3Dcurve的库或目标文件,就可以正常工作了。

      【讨论】: