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

#c #static #reference #g #undefined

#c #статический #ссылка #g #не определено

Вопрос:

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

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

 #ifdef __cplusplus
extern "C" 
{
#endif

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

    private:
    static MyClass log;

  }; 

//MyClass MyClass::log;

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

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

Когда я компилирую с помощью ‘g MyClass.cpp » Я получаю эту ошибку:
‘В функции MyClass::Instance()’ : MyClass.cpp : ‘Неопределенная ссылка на MyClass::log

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

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

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

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

Комментарии:

1. Почему вы пытаетесь в первую очередь указать связь с классом C ..?

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

3. Это не повторяющийся вопрос — проблема с extern "C" привязкой является новой. Голосование за повторное открытие.

Ответ №1:

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

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