再次在运行时“未定义的符号”,c ++

时间:2011-07-31 12:36:31

标签: c++ runtime undefined-symbol

我有一个数据类型,我可以实例化该类型的变量。像这样:

FetchAddr faddr(VirtualMemoryAddress( 0x0a ));

FetchAdr的定义是:

struct FetchAddr {
   VirtualMemoryAddress theAddress;
   FetchAddr(VirtualMemoryAddress anAddress)
     : theAddress(anAddress)
   { } 
};

现在我有一个faddr是私有(或公共)变量的类

class FLEXUS_COMPONENT(BPred)  {
   static FetchAddr faddr;
   public:
     FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
        : base( FLEXUS_PASS_CONSTRUCTOR_ARGS )
     {
        faddr = VirtualMemoryAddress( 0x0a );
     }
   ...
}

假设宏被正确定义。

代码编译和链接没有任何问题。但是,当我启动该程序时,它说:

 "undefined symbol: _ZN6nBPred14BPredComponent8faddr"

它说没有faddr的符号。

对此有何看法?

3 个答案:

答案 0 :(得分:3)

您必须在其他位置定义静态变量。

FetchAddr FLEXUS_COMPONENT(BPred) :: faddr;

在单个TU中。

答案 1 :(得分:3)

当您声明静态成员时,您还必须在某处定义它,就像在.cpp文件中一样。还要记得链接到这个文件。


问题2 - FetchAddr没有默认构造函数。

如果您需要faddr作为类的静态成员,则还需要在定义时为其赋值,例如:

FetchAddr FLEXUS_COMPONENT(BPred)::faddr(VirtualMemoryAddress( 0x0a ));

这会创建一个由faddr个对象共享的FLEXUS_COMPONENT(BPred)

如果您更喜欢每个对象都有自己的faddr变量副本,您可以将其设置为非静态并在构造函数中初始化它:

class FLEXUS_COMPONENT(BPred)  {
   FetchAddr faddr;
   public:
     FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
        : base( FLEXUS_PASS_CONSTRUCTOR_ARGS ),
          faddr(VirtualMemoryAddress( 0x0a ))
     { }
   // ...
};

答案 2 :(得分:2)

尝试使用-Wl,--no-undefined进行编译,以便链接器在有一个未在库或任何其他依赖项中定义的单个符号时将拒绝完成链接。

faddr没有正确关联,如果没有看到更多的程序,很难说明还有什么。