Доступ к основным глобальным переменным программы от dlopen () редактор динамическая библиотека в C на OS X

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

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

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

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

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

В противном случае существует ли больше "лучшей практики" способ выставить глобальную информацию динамично загруженным библиотекам?

7
задан idmean 25 March 2015 в 16:52
поделиться

2 ответа

Поместите глобальное значение в 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

9
ответ дан 6 December 2019 в 21:14
поделиться

Поскольку вы объявляете

int global;

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

int global;

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

extern int global;

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

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

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

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

3
ответ дан 6 December 2019 в 21:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: