导致未定义引用的链接中缺少什么?

时间:2019-05-15 22:02:24

标签: c++ linker fltk

要研究另一个问题(程序结束时出现free()错误),我尝试覆盖FLTK Fl_Input类的析构函数。 代码可以编译,但在链接中使用未定义的引用会失败。

我看了一些例子,但对答案的理解不够,以至于我不知道需要更改什么来解决问题。 尽管此程序不会重现free()问题,但是如果Fl_Input对象(和Fl_Output对象)产生消息,我可以确定哪个对象被无效地释放。

#include <FL/Fl.H>
#include <FL/Fl_Input.H>
#include <iostream>


class Fl_Inputc:public Fl_Input
{
  public:
    Fl_Inputc();
    Fl_Inputc(int left, int up, int width, int height, const char* label=0);
    ~Fl_Inputc()
    {
//   std::cout <<  " Inputc destroyed " << std::endl;
    };
};

Fl_Inputc input1( 90, 10, 180, 20, "     Input : ");

int main(int argc, char **argv) {
  return Fl::run();
}

我希望可以进行干净的编译并与修改后的析构函数链接,并且继承所有其他内容,但得到:

cbc:~/Projects/fltk/Tut/Potthast$ fltk-config --compile 07example4b.cxx 
g++ -I/usr/include/cairo -I/usr/include/glib-2.0
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include 
-I/usr/include/pixman-1 -I/usr/include/freetype2 
-I/usr/include/libpng12 -I/usr/include/freetype2 
-I/usr/include/cairo -I/usr/include/glib-2.0 
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include 
-I/usr/include/pixman-1 -I/usr/include/freetype2 
-I/usr/include/libpng12 -g -O2 -fvisibility-inlines-hidden 
-D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_THREAD_SAFE -D_REENTRANT 
-o '07example4b' '07example4b.cxx' -Wl,-Bsymbolic-functions -lfltk 
-lX11
/tmp/cc423i4F.o: In function `__static_initialization_and_destruction_0':
/Projects/fltk/Tut/Potthast/07example4b.cxx:17: undefined reference 
to `Fl_Inputc::Fl_Inputc(int, int, int, int, char const*)' 
collect2: error: ld returned 1 exit status

要使用@alter igel的建议来解决此问题,我使用了using语句从基类中获取构造函数。

#include <FL/Fl.H>
#include <FL/Fl_Input.H>
#include <iostream>


class Fl_Inputc:public Fl_Input
{
    public:
    using Fl_Input::Fl_Input;
    ~Fl_Inputc()
    {
     std::cout <<  " Inputc destroyed " << std::endl;
        };
};

Fl_Input  input0( 90, 10, 180, 20, "     Input0: ");
Fl_Inputc input1( 90, 40, 180, 20, "     Input1: ");

int main(int argc, char **argv) {
  return Fl::run();
}

1 个答案:

答案 0 :(得分:1)

链接器找不到Fl_Inputc(int left, int up, int width, int height, const char* label=0);的定义,因为您没有定义,而只是声明了