g++ Неопределенная ссылочная статическая переменная-член

Я компилирую это, используя g++ и makefile. Версия g++ — 4.1.2 20080704.

Вот упрощенный код, который все еще содержит ошибку:

#ifdef __cplusplus
extern "C" 
{
#endif

 class MyClass
  {
    public:
    MyClass() {};
    MyClass& operator=(MyClass&);
    static MyClass& instance() { return log; };

    private:
    static MyClass log;

  }; 

//MyClass MyClass::log;

int main()
{
  MyClass& myClass = MyClass::instance();
  return 0;
}

#ifdef __cplusplus
} //extern "C" 
#endif

Когда я компилирую с "g++ MyClass.cpp", я получаю эту ошибку: "In Function MyClass::Instance()": MyClass.cpp: "Неопределенная ссылка на MyClass::log

Если я компилирую с помощью «g++ MyClass.cpp -c», он создает объектный файл, но связывание этого файла вызывает ту же ошибку во время связывания. Я попытался определить статическую переменную с помощью "MyClass MyClass::log;" после определения класса, но поскольку он компилируется на C, я не думаю, что это сработает. Он выдает сообщение об ошибке «Связь C++ конфликтует с новым определением с помощью связи C».

Я не уверен, как это решить, я уже несколько дней бьюсь об это головой. Любая помощь приветствуется.

Дополнительная справочная информация:

Исходный файл cpp, из которого он получен, содержит «функции, определенные Simulink, которые должны использовать синтаксис C-функции». Я хотел бы внести как можно меньше изменений в существующий код. Я не программист на C, поэтому у меня есть ограниченное понимание здесь. Я знаю, что эти функции используются с simulink, и все компилируется внутри компилятора Matlab. Мы пытаемся экспортировать то, что создано Simulink, чтобы мы могли интегрировать его в другую программу, но это одна из многих проблем, с которыми мы столкнулись при компиляции. Надеюсь, это даст лучшую справочную информацию


person Spencer    schedule 16.10.2011    source источник
comment
Почему вы вообще пытаетесь дать связь класса C ..?   -  person ildjarn    schedule 17.10.2011
comment
Исходный файл cpp, из которого он получен, содержит определенные Simulink функции, которые должны использовать синтаксис C-функций. Я хотел бы внести как можно меньше изменений в существующий код. Я не программист на C, поэтому у меня есть ограниченное понимание здесь. Я знаю, что эти функции используются с simulink, и все компилируется внутри компилятора Matlab. Мы пытаемся экспортировать то, что создано Simulink, чтобы мы могли интегрировать его в другую программу, но это одна из многих проблем, с которыми мы столкнулись при компиляции. Надеюсь, это даст лучшую справочную информацию.   -  person Spencer    schedule 17.10.2011
comment
Это не повторяющийся вопрос - проблема с extern "C" связью является новой. Голосование за открытие.   -  person TonyK    schedule 17.10.2011


Ответы (1)


Объявление MyClass::log в определении класса получает связь C++, несмотря на extern "C", потому что статические члены класса просто не существуют в C. Но по какой-то причине определение MyClass::log вне определения класса получает связь C, что для меня не имеет особого смысла.

Но вы можете обойти проблему, удалив определение из области действия файла extern "C". Почему вы все равно используете extern "C" в файле C++?

person TonyK    schedule 16.10.2011