开发者

again "undefined symbol" in runtime, c++

开发者 https://www.devze.com 2023-03-25 09:24 出处:网络
I have a data type and I can instantiate a variable of that type. like this: FetchAddr faddr(VirtualMemoryAddress( 0x0a ));

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)
   { } 
};
开发者_C百科

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?


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


You must define the static variable elsewhere.

FetchAddr FLEXUS_COMPONENT(BPred) :: faddr;

In a single TU.


Try compiling with the -Wl,--no-undefined so that the linker will refuse to complete the link if there is even a single symbol which is not defined in a library or any other dependencies.

faddr has not been properly linked and without seeing more of your program, it is hard to tell what else is going on.

0

精彩评论

暂无评论...
验证码 换一张
取 消