mah*_*ood 6 c++ runtime undefined-symbol
我有一个数据类型,我可以实例化该类型的变量。像这样:
FetchAddr faddr(VirtualMemoryAddress( 0x0a ));
Run Code Online (Sandbox Code Playgroud)
FetchAdr 的定义是:
struct FetchAddr {
VirtualMemoryAddress theAddress;
FetchAddr(VirtualMemoryAddress anAddress)
: theAddress(anAddress)
{ }
};
Run Code Online (Sandbox Code Playgroud)
现在我有一个类 faddr 是一个私有(或公共)变量
class FLEXUS_COMPONENT(BPred) {
static FetchAddr faddr;
public:
FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
: base( FLEXUS_PASS_CONSTRUCTOR_ARGS )
{
faddr = VirtualMemoryAddress( 0x0a );
}
...
}
Run Code Online (Sandbox Code Playgroud)
假设宏定义正确。
代码编译和链接没有任何问题。但是,当我启动程序时,它说:
"undefined symbol: _ZN6nBPred14BPredComponent8faddr"
Run Code Online (Sandbox Code Playgroud)
它说 faddr 没有符号。
有什么想法吗?
当您声明静态成员时,您还必须在某个地方定义它,例如在 .cpp 文件中。并且还要记住链接到该文件。
\n\n问题 2 -FetchAddr没有默认构造函数。
如果您需要有faddr作为类的静态成员,则还需要在定义时为其指定一个值,例如:
FetchAddr FLEXUS_COMPONENT(BPred)::faddr(VirtualMemoryAddress( 0x0a ));\nRun Code Online (Sandbox Code Playgroud)\n\n这创造了一个faddr所有人共享的FLEXUS_COMPONENT(BPred)。
如果您希望每个对象都有自己的副本faddr,则可以将其设置为非静态并在构造函数中对其进行初始化:
class FLEXUS_COMPONENT(BPred) \xc2\xa0{\n\xc2\xa0 FetchAddr faddr;\n\xc2\xa0 \xc2\xa0public:\n\xc2\xa0 \xc2\xa0 \xc2\xa0FLEXUS_COMPONENT_CONSTRUCTOR(BPred)\n\xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 : base( FLEXUS_PASS_CONSTRUCTOR_ARGS ),\n faddr(VirtualMemoryAddress( 0x0a ))\n\xc2\xa0 \xc2\xa0 \xc2\xa0{\xc2\xa0}\n\xc2\xa0 \xc2\xa0// ...\n};\nRun Code Online (Sandbox Code Playgroud)\n