C++ 又是";“未定义符号”;在运行时,c++;

C++ 又是";“未定义符号”;在运行时,c++;,c++,runtime,undefined-symbol,C++,Runtime,Undefined Symbol,我有一个数据类型,我可以实例化该类型的变量。像这样: FetchAddr faddr(VirtualMemoryAddress( 0x0a )); FetchAdr的定义是: struct FetchAddr { VirtualMemoryAddress theAddress; FetchAddr(VirtualMemoryAddress anAddress) : theAddress(anAddress) { } }; 现在我有一个类,faddr是一个私有(或

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

FetchAddr faddr(VirtualMemoryAddress( 0x0a ));
FetchAdr的定义是:

struct FetchAddr {
   VirtualMemoryAddress theAddress;
   FetchAddr(VirtualMemoryAddress anAddress)
     : theAddress(anAddress)
   { } 
};
现在我有一个类,faddr是一个私有(或公共)变量

假设宏定义正确

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

 "undefined symbol: _ZN6nBPred14BPredComponent8faddr"
上面说faddr没有符号


你知道吗?

你必须在别处定义静态变量

FetchAddr FLEXUS_COMPONENT(BPred) :: faddr;

在单个TU中。

当您声明静态成员时,还必须在某个地方定义它,例如在.cpp文件中。还要记住链接到此文件


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

如果需要将
faddr
作为类的静态成员,则还需要在定义时为其指定一个值,如:

FetchAddr FLEXUS_COMPONENT(BPred)::faddr(VirtualMemoryAddress( 0x0a ));
这将创建一个由所有
FLEXUS\u组件(BPred)
对象共享的
faddr

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

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

尝试使用
-Wl,--no undefined
编译,这样,即使库或任何其他依赖项中没有定义单个符号,链接器也会拒绝完成链接


faddr
没有正确链接,如果看不到更多的程序,很难判断还有什么其他情况发生。

错误:在“:”标记之前应该有初始值设定项,TU也是什么意思?TU=翻译单位。翻译单元是在预处理器运行后的
.cpp
文件(因此,在所有
#include
'd文件展开后)。它基本上是一个源文件加上它包含的所有头文件。@mahmood:您的错误是因为宏不仅命名了类,还继承了一些基类,而这些基类在这种意义上是不可能出现的。您必须使用类的真实名称而不是宏调用-顺便说一句,这种使用宏的方式很可怕。有没有办法避免使用静态变量?我试图删除“statis”关键字,但我得到了编译错误:BPredImpl.cpp:36:错误:调用“FetchAddr::FetchAddr()”没有匹配的函数。好的,谢谢,我尝试了“非静态”方法,效果很好。
class FLEXUS_COMPONENT(BPred)  {
   FetchAddr faddr;
   public:
     FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
        : base( FLEXUS_PASS_CONSTRUCTOR_ARGS ),
          faddr(VirtualMemoryAddress( 0x0a ))
     { }
   // ...
};