Экспорт переменной из статической библиотеки C ++
Вопрос
У меня есть статическая библиотека, написанная на 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 в исходном файле статической библиотеки
Я озадачен...Почему мы видим что-то другое?Можете ли вы объяснить, что происходит?