I have a data type and I can instantiate a variable of that type. like this:
FetchAddr faddr(VirtualMemoryAddress( 0x0a ));
The definition of FetchAdr is:
struct FetchAddr {
VirtualMemoryAddress theAddress;
FetchAddr(VirtualMemoryAddress anAddress)
: theAddress(anAddress)
{ }
};
Now I have a class that faddr is a private (or public) variable
class FLEXUS_COMPONENT(BPred) {
static FetchAddr faddr;
public:
FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
: base( FLEXUS_PASS_CONSTRUCTOR_ARGS )
{
faddr = VirtualMemoryAddress( 0x0a );
}
...
}
Assume the macros are defined properly.
The code compiles and links without any problem. However when I start the program, it says:
"undefined symbol: _ZN6nBPred14BPredComponent8faddr"
it says there no symbol for faddr.
any idea about that?
The error is produced by the linker, ld . It is telling you that the symbol pow cannot be found (is undefined in all the object files handled by the linker). The solution is to include the library which includes the implementation of the pow() function, libm (m for math).
UNDEFINED SYMBOL AT COMPILE TIME An undefined symbol at compile time indicates that the named identifier was used in the named source file, but had no definition in the source file. This is usually caused by a misspelled identifier name, or missing declaration of the identifier used.
A symbol remains undefined when a symbol reference in a relocatable object is never matched to a symbol definition. Similarly, if a shared object is used to create a dynamic executable and leaves an unresolved symbol definition, an undefined symbol error results.
When you declare a static member you also have to define it somewhere, like in a .cpp file. And also remember to link to this file.
Problem number 2 - FetchAddr
doesn't have a default constructor.
If you need to have faddr
as a static member of the class, you also need to give it a value when it is defined, like:
FetchAddr FLEXUS_COMPONENT(BPred)::faddr(VirtualMemoryAddress( 0x0a ));
That creates an faddr
that is shared by all FLEXUS_COMPONENT(BPred)
objects.
If you rather have it that each object has its own copy of the faddr
variable, you can make it non-static and initialize it in the constructor:
class FLEXUS_COMPONENT(BPred) {
FetchAddr faddr;
public:
FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
: base( FLEXUS_PASS_CONSTRUCTOR_ARGS ),
faddr(VirtualMemoryAddress( 0x0a ))
{ }
// ...
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With