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 ))
{ }
// ...
};