Ошибка C LNK2001 при попытке использовать внешнюю переменную

#c #linker #namespaces #extern #lnk2001

#c #компоновщик #пространства имен #внешний #lnk2001

Вопрос:

Я пытаюсь создать служебный класс, который я мог бы использовать в своей программе, например, для ведения журнала, отладки и т. Д.

В Java я знаю, что могу сделать это, объявив переменные и функции статическими, поскольку я читал больше о том, как это сделать на C , я должен использовать extern, окруженный пространством имен, чтобы не заполнять слишком много файлов. При попытке инициализировать эти внешние переменные в классе конструктора я получаю следующие ошибки:

application.cpp.obj: ошибка LNK2001: неразрешенный внешний символ «класс Application * Lib::app»

application.cpp.obj: ошибка LNK2001: неразрешенный внешний символ «class Graphics * Lib::graphics»

Что мне мало что говорит, кроме того, что существует проблема со связыванием? У меня есть следующие 2 файла:

 // lib.h
#ifndef LIB_H
#define LIB_H

#include "graphics.h"
#include "application.h"

namespace Lib {
    extern Application *app;
    extern Graphics *graphics;
}

#endif //LIB_H


// application.cpp
#include "include/application.h"
#include "include/lib.h"
.
Application::Application(Listener* listener, Configuration* config, Graphics* graphics) {
    .
    .
    // Our library for graphics
    this->graphics = graphics;
    .
    .
    // creating the environment utils
    Lib::app = this;
    Lib::graphics = graphics;
    .
    .
}
 

Ответ №1:

extern означает, что вы определяете свои переменные в другом месте. В вашем случае необходимо включить следующее в lib.cpp:

 namespace Lib {
    Application *app;
    Graphics *graphics;
}
 

Тем не менее, ваш дизайн вызывает сомнения:

В Java я знаю, что могу сделать это, объявив переменные и функции статическими

Вы можете сделать то же самое в C , и в этом случае это имело бы больше смысла.

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

1. Черт, это было так просто… Большое вам спасибо, Евгений! Я где-то читал, что static создает для каждого файла копию статической переменной, а это не то, что я хочу

2. Ключевое слово static имеет много значений в c . Вы говорите о статической области видимости файла и области видимости функции. Я упомянул статический член класса, который имеет то же значение, что и в Java.