#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 ?