Экспорт переменной из статической библиотеки C ++

StackOverflow https://stackoverflow.com/questions/91420

  •  01-07-2019
  •  | 
  •  

Вопрос

У меня есть статическая библиотека, написанная на 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;} и попробуйте использовать его в основном модуле.

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

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

Это было полезно?

Решение

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

Другие советы

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

struct Format
{
    [...]
    static Format gFmt128;
};
// Format.cpp
Format Format::gFmt128 = { 0, 128, 0 }

Вам нужно объявить свои объекты формата как внешний нет статический

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

Единственный способ, которым я получаю неразрешенные внешние эффекты, - это

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top