Как определить необязательную точку входа в пользовательскую платформу Mac OS X / динамическую библиотеку? - PullRequest
4 голосов
/ 01 июня 2011

В Windows есть DllMain и DLL_PROCESS_ATTACH / DLL_PROCESS_DETACH флаги, которые позволяют инициализировать / освободить ресурсы после присоединения DLL к процессу ... Так как я могу указать точку входа в случае OS X ?Как всегда, я не могу найти ничего полезного в документации Apple: (

Ответы [ 4 ]

5 голосов
/ 02 июня 2011

В документе Темы программирования динамической библиотеки на веб-сайте Apple показано использование

__attribute__((constructor))

и

__attribute__((destructor))

для реализации инициализаторов и финализаторов в динамических библиотеках.

3 голосов
/ 02 июня 2011

Разве это не сработает?

__attribute__((constructor)) void DllMain() 
{ 
  // code
} 
2 голосов
/ 02 июня 2011

Я думаю, что у malkia (upvoted) и Bavarious есть правильный ответ, но, поскольку я уже искал его: один из способов сделать это - установить процедуру инициализации. Ищите «Процедуру инициализации» в настройках сборки XCode для вашей библиотеки. Префикс имени функции с подчеркиванием. То есть если ваша процедура инициализации называется DllMain, введите "_DllMain".

Кроме того, ранее я выполнял некоторую инициализацию, используя obj-c ++, делая что-то вроде этого:

class LibraryInit
{
    public LibraryInit()
    {
        // do some init stuff here
    }
} ;
static LibraryInit sLibraryInit();
0 голосов
/ 03 октября 2013

Мое основное приложение статически связывается со статической библиотекой A с функцией ABC, а моя динамическая библиотека xyz.dylib также статически связывается с той же статической библиотекой A, которая имеет ту же функцию ABC.

Теперь, когда основное приложение загружает xyz.dylib, используя dlopen во время выполнения.Инициализатор вызывается там, где я вызвал функцию ABC.Эта функция ABC вызывается из адресного пространства основного приложения.Это действительно странно, и я не знаю, что не так?Хотя он должен был вызвать функцию ABC из dylib.

...