2015-03-26 2 views
1

В статье 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 дня. Если вы чувствуете, что я забыл предоставить некоторую важную информацию, просто спросите, и я постараюсь добавить его к вопросу как можно скорее! Спасибо :-)

ответ

4

Вопрос:

Если ожидается, что бы мне нужно сделать, сделать переменную совместно через плагины?

Сделайте myLibrary динамической библиотекой (.so) вместо статической библиотеки (.a).

+0

Я тоже подумал об этом. К сожалению, инфраструктура делает это для меня, я не могу ничего изменить в том, как это скомпилировано, поскольку оно должно быть совместимо с каркасом. – Thomas

+1

Тогда вы должны жить последствием того, что 'plugin1' и' plugin2' будут иметь свои собственные копии 'cMyLibraryClass :: myGlobalBool'. –

+0

Вот чего я боялся. Чтобы быть уверенным, каким будет параметр для перехода к g ++, чтобы сделать его общим вместо статического? Разве это? Может быть, я могу проследить, где это (не) установить и каким-то образом изменить его ... – Thomas

0

Итак, принятый ответ был решением моей проблемы.На всякий случай, когда кто-либо когда-либо сталкивался с такой же проблемой с ADTF (Automotive Data и Time-Triggered Framework), решение на самом деле действительно просто, когда вы знаете, где искать:

В главном файле вашего SCOS-скрипта вашего расширения, последняя строка должна сказать что-то вроде:

Extension (extensionEnv, имя, источников = источники, статический = True, install_headers = заголовки)

Вам просто нужно изменить статическую ложь. Затем перейдите в сборку/[linux, win]/[release, debug]/$ yourextensionname и удалите все. Также удалите все оставшиеся файлы .a в своей папке расширения, а затем перестройте с нуля. Вот так :-)

Смежные вопросы