Доступ к глобальным переменным основной программы из динамической библиотеки dlopen () ed в C на OS X - PullRequest
7 голосов
/ 19 декабря 2009

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

В частности, поскольку это приложение Gtk +, я использую gmodule, но вопрос также относится к загрузке динамической библиотеки на основе dlfcn.h / dlopen ().

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

В Linux я мог бы просто обратиться к этой глобальной переменной напрямую - это хорошо работает, и я предполагаю, что gcc или компоновщик позаботятся об экспорте глобальных переменных из основной программы в динамические библиотеки.

Проблема в том, что это не работает в Mac OS X. Есть ли способ сделать это в OS X?

Если нет, существует ли более эффективный способ предоставления глобальной информации динамически загружаемым библиотекам?

Ответы [ 2 ]

9 голосов
/ 19 декабря 2009

Поместите глобальный в main.c и объявите его extern в общем объекте, и попробуйте это:

MACOSX_DEPLOYMENT_TARGET=10.3 ld -dylib -undefined dynamic_lookup -o multiply.so multiply.o

или

MACOSX_DEPLOYMENT_TARGET=10.3 libtool -dynamic -undefined dynamic_lookup -o multiply.so multiply.o

У меня это работало в Mac OS X 10.4

3 голосов
/ 19 декабря 2009

Так как вы объявляете

int global;

в заголовке multiply.h, DLL и основная программа имеют свою собственную копию. Вместо этого объявите глобальный в main.c

int global;

и в multiply.c объявить его как extern:

extern int global;

Теперь, если вы связываете main.cpp с параметром -rdynamic, символы исполняемого файла будут экспортированы в DLL.

Я тестировал это под Linux, и это работало, но я боюсь, что у меня нет доступа к тестированию на MacOS. Поскольку ваш ssample-код также не работал в Linux, я думаю, что это была проблема.

...