снова "неопределенный символ" во время выполнения, c ++ - PullRequest
4 голосов
/ 31 июля 2011

У меня есть тип данных, и я могу создать экземпляр переменной этого типа. как это:

FetchAddr faddr(VirtualMemoryAddress( 0x0a ));

Определение FetchAdr:

struct FetchAddr {
   VirtualMemoryAddress theAddress;
   FetchAddr(VirtualMemoryAddress anAddress)
     : theAddress(anAddress)
   { } 
};

Теперь у меня есть класс, в котором faddr является частной (или публичной) переменной

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

Предположим, что макросы определены правильно.

Код компилируется и связывается без проблем. Однако когда я запускаю программу, она говорит:

 "undefined symbol: _ZN6nBPred14BPredComponent8faddr"

там написано, что для фаддра нет символа.

есть идеи по этому поводу?

Ответы [ 3 ]

3 голосов
/ 31 июля 2011

Когда вы объявляете статический член, вы также должны определить его где-нибудь, как в файле .cpp.А также не забудьте сослаться на этот файл.


Задача № 2 - FetchAddr не имеет конструктора по умолчанию.

Если вам нужно иметь faddr в качестве статическогочлен класса, вам также нужно дать ему значение, когда оно определено, например:

FetchAddr FLEXUS_COMPONENT(BPred)::faddr(VirtualMemoryAddress( 0x0a ));

Это создает faddr, который используется всеми FLEXUS_COMPONENT(BPred) объектами.

Если вы предпочитаете, чтобы у каждого объекта была своя собственная копия переменной faddr, вы можете сделать ее нестатичной и инициализировать ее в конструкторе:

class FLEXUS_COMPONENT(BPred)  {
   FetchAddr faddr;
   public:
     FLEXUS_COMPONENT_CONSTRUCTOR(BPred)
        : base( FLEXUS_PASS_CONSTRUCTOR_ARGS ),
          faddr(VirtualMemoryAddress( 0x0a ))
     { }
   // ...
};
3 голосов
/ 31 июля 2011

Вы должны определить статическую переменную в другом месте.

FetchAddr FLEXUS_COMPONENT(BPred) :: faddr;

В одном ТУ.

2 голосов
/ 31 июля 2011

Попробуйте скомпилировать с -Wl,--no-undefined, чтобы компоновщик отказался завершить ссылку, если есть хотя бы один символ, который не определен в библиотеке или любых других зависимостях.

faddr не был должным образом связан и, не видя больше вашей программы, трудно сказать, что еще происходит.

...