неопределенная ссылка при использовании extern - PullRequest
5 голосов
/ 07 сентября 2010

У меня есть следующие настройки (надеюсь, это не слишком простой пример):

Ач

typedef std::map<unsigned int, float> MyClass;
extern MyClass inst;

A.cpp

MyClass inst;

Bh

#include <A.h>
void foo();

B.cpp

#include <B.h>
void foo {
    inst.myClassFunc();
}

Теперь, когда я использую inst вB.cpp Я получаю undefined reference to inst.

Есть идеи, как это исправить?

Ответы [ 4 ]

11 голосов
/ 17 июля 2013

Я знаю, что этот вопрос старый, но он все еще может быть полезен для кого-то.

Глобальная переменная (здесь: MyClass inst) не должна быть extern для единицы компиляции, которая определяет it (здесь: A.cpp)

Один из способов достижения этого:

  • объявите вашу глобальную переменную в отдельном заголовке (скажем global.h) и включите этот заголовок в * cpp, используя их.
  • удалить ключевое слово extern для модуля компиляции, которое определяет их (например, с #ifdef):

global.h выглядит так:

#ifdef A_H_
  #define EXTERN
#else
  #define EXTERN extern
#endif

EXTERN MyClass inst;

пока A.h выглядит так:

#ifndef A_H_
#define A_H_

// your header content (without globals)

#endif /* A_H_ */

и A.cpp:

#include "A.h"
#include "global.h" // after A.h inclusion, we need A_H_ definition

Надеюсь, это поможет!

0 голосов
/ 07 сентября 2010

Вы должны скомпилировать вышеупомянутый файл A.cpp как

g++ -c A.cpp
g++ -c B.cpp

и затем при создании исполняемого файла вы должны написать команду следующим образом:

g++ A.o B.o
0 голосов
/ 07 сентября 2010

Исходя из приведенного вами примера кода, я бы сказал, что вы забыли #include <B.h> в вашем файле B.cpp.

0 голосов
/ 07 сентября 2010

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

Нам нужно увидеть определение MyClass и точно знать, где он находится.

...