Экспорт переменной из статической библиотеки C ++ - PullRequest
3 голосов
/ 18 сентября 2008

У меня есть статическая библиотека, написанная на C ++, и у меня есть структура, описывающая формат данных, т.е.

struct Format{
    long fmtId;
    long dataChunkSize;
    long headerSize;

    Format(long, long, long);

    bool operator==(Format const & other) const;
};

Некоторые из форматов данных широко используются, такие как {fmtId=0, dataChunkSize=128, headerSize=0} и {fmtId=0, dataChunkSize=256, headerSize=0}

Некоторые классы структуры данных получают формат в конструкторе. Мне бы хотелось иметь какие-то ярлыки для этих широко используемых форматов, например пару глобальных Format членов gFmt128, gFmt256, которые я могу передать по ссылке. Я создаю их экземпляр в файле .cpp, например

Format gFmt128(0, 128, 0);

и в .h есть

extern Format gFmt128;

также я объявляю Format const & Format::Fmt128(){return gFmt128;} и пытаюсь использовать его в основном модуле.

Но если я попытаюсь сделать это в основном модуле, который использует lib, компоновщик пожалуется на неразрешенный внешний gFmt128.

Как я могу заставить мою библиотеку «экспортировать» эти глобальные переменные, чтобы я мог использовать их из других модулей?

Ответы [ 4 ]

7 голосов
/ 18 сентября 2008

Не используйте ключевое слово static в глобальных объявлениях. Вот статья, объясняющая видимость переменных с / без статического . Статика дает глобальные внутренние связи, то есть видимые только в той единице перевода, в которой они объявлены.

2 голосов
/ 18 сентября 2008

Вам необходимо объявить ваши объекты Format как extern , а не static

2 голосов
/ 18 сентября 2008

Они также определены в файле .cpp? Грубо говоря, это должно выглядеть так:

struct Format
{
    [...]
    static Format gFmt128;
};
// Format.cpp
Format Format::gFmt128 = { 0, 128, 0 }
1 голос
/ 18 сентября 2008

Морхвеус, я тоже это попробовал. Мой компоновщик скорее говорит, что он уже определен символ gFmt128. Это действительно то поведение, которое я ожидал: компилятор добавляет тело функции как к библиотеке, так и к клиентскому объекту, поскольку оно определено во включаемом файле.

Единственный способ получить неразрешенные внешние данные - это

  • не добавляет статическую библиотеку к объектам, которые будут связаны
  • не определяет символ gFmt128 в исходном файле статической библиотеки

Я озадачен ... Почему мы видим что-то другое? Можете ли вы объяснить, что происходит?

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