Здравствуйте, товарищи гуру!
Вот, возникла очередная нетривиальная непонятка. Даже не знаю, на что грешить -- компилёр или руки.so . Попробую описать словами, там уже кода не имеющего отношения к проблеме порядочно... Итак, поехали:
Делается свой виджет. Компилируется (из нескольких исходников) в libMyWidget.so. Кроме, собственно, виджета, там заведены еще кое-какие переменные и процедурки, их использующие. Затем в приложении PhAB-а привешиваю к этому виджету коллбэки, в которых, в том числе, используется переменная, объявленная в .SO-шке.
Так вот. Похоже, обращения к одной и той же переменной из процедур в .SO-шке и из коллбэков приложения приводят к работе с разными кусками памяти!
Попробую пояснить:
Заголовок:
// ++++++++++++ MyWidget.h : ++++++++
// ...
extern int Var;
void ModifyVar(void);
Код в исходнике:
// +++++++++++ MyWidget.c : ++++++++
#include "MyWidget.h"
int Var;
void ModifyVar(void)
{
Var=0;
};
Файл с коллбэками в приложении:
// ++++++++++++ MyCallBacks.c +++++++++++++++
...
#include "MyWidget.h"
...
int MyCallback( PtWidget_t *w, void *data, PtCallbackInfo_t *cbinfo )
{
Var = 0x55AA; // Присвоили свое значение
ModifyVar(); // Здесь Var должна обнулиться!!!
... // ...но при последующем использовании Var
// остается 0x55AA !!!
};
Т.е. такое впечатление, что "Var" в библиотеке и "Var" в приложении разные! Нигде в других местах "Var" не объявляется, и, по идее, должно быть глобальным.
Это мое непонимание работы с переменными в разных модулях компиляции, или глюки компилятора?