Я не профессионал, но мне нравится этот способ
Префикс приложения = XY; View = v; Хранимая процедура = p; Функция = F
Table: XY_Name
View: vXY_Name
Procedure: sXY_Name
Function: fXY_Name
Что вы думаете? Я знаю, что некоторые люди используют два символа для определения типа объекта, но одного символа достаточно для большинства случаев, верно?
Библиотеки должны экспортировать инициализацию и процедуры очистки с использованием gcc Атрибуты функций __attribute __ ((конструктор)) и __attribute __ ((деструктор)). См. Информационные страницы gcc для информация об этом. Конструктор процедуры выполняются перед dlopen возвращает (или до запуска main () если библиотека загружается при загрузке время). Подпрограммы деструктора выполняется до возврата dlclose (или после exit () или завершения main () если библиотека загружается при загрузке время). Прототипы C для этих функции:
void __attribute__ ((constructor)) my_init(void);
void __attribute__ ((destructor)) my_fini(void);
Взято из http://tldp.org/HOWTO/Program-Library-HOWTO/index.html
То есть вы просто добавляете __attribute__ ((конструктор)) к функциям, которые вы хотите, чтобы его вызывали при загрузке разделяемой библиотеки. В приведенном выше документе также отмечается, что старые функции _ini и _fini считаются устаревшими.
Да. Когда библиотека открыта, происходит все статическое построение ... поэтому, если вы используете C ++, вы можете:
// mylibrary.cpp namespace { class dynamic_library_load_unload_handler { public: dynamic_library_load_unload_handler(){ // Code to execute when the library is loaded } ~dynamic_library_load_unload_handler(){ // Code to execute when the library is unloaded } } dynamic_library_load_unload_handler_hook; }
В отличие от предложенных решений __ attribute__ ((constructor))
, это будет переносимым. Однако обратите внимание, что если у вас есть несколько подобных объектов, нет никакой гарантии в отношении порядка построения / уничтожения.
По крайней мере, в Linux и, вероятно, по крайней мере в некоторых других системах Unix, если библиотека открывается динамически, глобальная функция с именем _init
, если она существует, будет вызываться динамическим компоновщиком.