В статье previous question я описал проблему, что статические переменные-члены класса действительно имеют разные значения для разных других классов, включая их.Переменная статического члена класса в статической библиотеке не используется?
При дальнейших исследованиях выяснилось, что блок перевода, содержащий класс со статической переменной-членом, скомпилируется в статическую библиотеку (расширение .a). Другие единицы перевода (позволяет вызывать их плагины, я работаю в довольно сложной структуре с именем ADTF), которые позже скомпилируются и связаны с этой библиотекой.
Мой вопрос сейчас: Ожидается ли, что классы в plugin1 и plugin2 получат свой собственный myGlobalBool? Когда я запускаю программу, изменение cMyLibraryClass :: myGlobalBool из плагина1 не изменяет переменную в plugin2. Если ожидается, что мне нужно сделать, чтобы переменная была разделена между плагинами? Обратите внимание, что я под Linux, некоторые другие вопросы по SO (here, here), похоже, указывают на то, что для Windows .dll это ожидается, но в остальном это не помогло мне.
Пример того, что я делаю (это более сложный, чем и ошибка может быть где-то еще):
myLibrary.h
cMyLibraryClass
{
cMyLibraryClass();
static bool myGlobalBool;
// Other static variables and stuff
}
myLibrary.cpp
include myLibrary.h
bool cMyLibraryClass::myGlobalBool;
cMyLibraryClass::cMyLibraryClass()
{
// Constructor stuff
}
// Other function implementations of cMyLibraryClass
В конечном итоге с
libMyLibrary.a
Плагины получить связаны Withthe следующие опции: (я удалил пути и все другие библиотеки, которые получают включены)
Plugin 1:
г ++ -o plugin1.plb -shared - Wl, -Bsymbolic -Wl, - нет-неопределенные -shared plugin1.os -lmyLibrary
Plugin 2:
г ++ -o plugin2.plb -shared -Wl, -Bsymbolic -Wl, - нет-неопределенные -shared plugin2.os -lmyLibrary
Я ценю любые предложения о том, что происходит здесь, я мы пытались понять уже 2 дня. Если вы чувствуете, что я забыл предоставить некоторую важную информацию, просто спросите, и я постараюсь добавить его к вопросу как можно скорее! Спасибо :-)
Я тоже подумал об этом. К сожалению, инфраструктура делает это для меня, я не могу ничего изменить в том, как это скомпилировано, поскольку оно должно быть совместимо с каркасом. – Thomas
Тогда вы должны жить последствием того, что 'plugin1' и' plugin2' будут иметь свои собственные копии 'cMyLibraryClass :: myGlobalBool'. –
Вот чего я боялся. Чтобы быть уверенным, каким будет параметр для перехода к g ++, чтобы сделать его общим вместо статического? Разве это? Может быть, я могу проследить, где это (не) установить и каким-то образом изменить его ... – Thomas