undefined reference to *** —— 类成员

转载 2012年03月30日 17:50:22
undefined reference to *** —— 类成员
2009-05-09 14:13
undefined reference to ***这个链接错误的花样总是层出不穷(more),这一次是找不到类中的成员。

例子1:undefined reference to VS. 类静态成员变量

在文件hAB.h中声明了类A与类B:
class A
{
     public:
         void funA();
}

class B
{
     public:
          void funB();
     private:
          static A *pa;                  // 注:这里把成员变量声明为static
}

文件fA.cpp实现类A:
void A::funA()
{
     printf("I am funA()\n");
}

文件fB.cpp实现类B:
void B::funB()
{
     pa = new A();
     pa->funA();
}

文件fM.cpp实现main函数:
int main(int argc, char *argv[])
{
     B *pb = new B();
     pb->funB();
     return 0;
}

Makefile:先生成fA.o与fB.o,然后打包为libtest.a;再生成fM.o,最后用“g++ fM.o -ltest -o fM”把目标文件链接起来并生成可执行文件fM。

问题:
gcc返回链接错误:undefined reference to 'B::pa'。然而,把类B中的pa声明为非static变量,则可以通过编译。

WHY:
先复习一下static data members in class。
[1] a single piece of storage for a static data member, regardless of how many objects of that class you create.
[2] the static data belongs to the class. Its name is scoped inside the class and all objects share that data member.
[3] NOTE: The linker will report an error if a static data member is declared but not defined.

所以,问题就出在:在class中,无法对static data member进行复制,即便是在构造函数中对static data member进行赋值,linker还是会报错。
因为static data member不属于任何一个对象,所以即便是在创建对象的时候进行赋值,也只能说明,这个对象对这个data member重新赋值而已。
因此,这里的undefined reference to ***,是找不到类静态成员变量的定义。

解决方法:
The definition must occur outside the class (no inlining is allowed), and only one definition is allowed.
It is common to put it in the implementation file for the class.
其实,也就是在全局的地方对静态成员变量赋值。

在上面的例子中,可在文件fB.h中加上pa的定义:
A *B::pa = new A();

----------------------------------------------------------------------------------------------------------------------------------

例子2:undefined reference to VS. 虚函数

在文件hAB.h中声明了类A与类B:
class A
{
     public:
         virtual void fun();
}

class B : public A
{
     public:
          void fun();
}

文件fB.cpp实现类B:
void B::fun()
{
     printf("I am B::fun()\n");
}

文件fM.cpp实现main函数:
int main(int argc, char *argv[])
{
     A *pa = new B();
     pa->fun();
     return 0;
}

问题:
gcc返回链接错误:undefined reference to 'vtable for A'。
这是因为(个人认为),编译器在建立虚函数表的时候,找不到A::fun()在.text segment中的地址,所以便无法完成虚函数表的创建。

解决方法:
1] 实现A::fun()
2] 将A::fun()声明为纯虚函数,也就是virtual void fun() = 0;

linux内核编译问题——undefined reference to `error'

内核版本 2.6.33.9 make zImage时出现如下错误: LD arch/arm/boot/compressed/vmlinux arch/arm/boot/compres...

Linux下使用nm命令排查和解决“undefined reference to ”

一、案例      编译出一个动态库.libXXXEngine.so。然后直接在另一个工程中,把头文件include进来,并link到该库:-lXXXEngine. 尝试编译,出错: ...
  • weiqubo
  • weiqubo
  • 2013年12月04日 00:22
  • 1044

【嵌入式Linux】[内核编译]:内核编译时出现的问题:undefined reference to `__gnu_mcount_nc'

编译内核时出现了以下错误信息: To see full details build your kernel with: 'make CONFIG_DEBUG_SECTION_MISMATCH=y'  ...
  • z21109
  • z21109
  • 2014年07月29日 23:51
  • 1646

c++ template 多层继承下找不到纯虚拟函数实现 报错:undefined reference to "xxx"

如下代码中,定义了3个类,ClassA,ClassB,ClassC,依次为被继承关系,ClassA,ClassB是模板类, 在ClassA中定义了一个纯虚拟函数getKeyFromObject,实现...
  • 10km
  • 10km
  • 2015年10月13日 14:37
  • 1209

编译php7.1.4出现 undefined reference to isfinite

我在 CentOS5.5 上编译 php7.1.4 出现错误: ext/standard/.libs/var.o: In function `php_var_export_ex': /PHP/32/s...
  • letshi
  • letshi
  • 2017年05月04日 11:32
  • 998

连接时出错,(.ARM.exidx+0x0): undefined reference to `__aeabi_unwind_cpp_pr0'

文件1:crt0.s.text.global _start_start:        ldr r0,=0x53000000      @WTCON        mov r1,#0        s...

undefined reference to `av_close_input_file' 原因分析

这是使用libdlna0.2.4与ffmpeg2.4.2搭配遇到的问题 解决方法是使用ffmpeg2.2.9版本(更久的版本没测试过), 或者坚持要使用ffmpeg2.4.2版本的话,只需将 …/ff...
  • wonxxx
  • wonxxx
  • 2014年10月27日 09:44
  • 4441

内核函数 do_div() 与 undefined reference to __udivdi3

本文来自:http://hi.baidu.com/serial_story/blog/item/8ff17654ecae9e58574e0018.html 【问题】 编译Linux下面的代码,...

linux c++ 编译undefined reference to

Linux下编译程序时,经常会遇到“undefined reference error” 报错, 这里总结一些可能的原因和解决方案,给需要的朋友: 说道undefined referenc...

/host/src1/2/Linux-PAM-1.1.1/libpam/.libs/libpam.so: undefined reference to `getutline'

/bin/bash ../../libtool --tag=CC   --mode=link arm-linux-androideabi-gcc -I../../libpam/include -I.....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:undefined reference to *** —— 类成员
举报原因:
原因补充:

(最多只允许输入30个字)