g ++ неопределенная ссылочная статическая переменная-член - PullRequest
1 голос
/ 17 октября 2011

Я компилирую это, используя g ++ и make-файл.Версия 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.» Я хотел бы внести как можно меньше изменений вTон существующий код.Я не программист на Си, поэтому здесь у меня ограниченное понимание.Я знаю, что эти функции используются с simulink, и все компилируется внутри компилятора Matlab.Мы пытаемся экспортировать созданное simulink, чтобы мы могли интегрировать его в другую программу, но это одна из многих проблем, с которыми мы сталкиваемся при компиляции.Надеюсь, это даст лучшую справочную информацию

1 Ответ

2 голосов
/ 17 октября 2011

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

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

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