C++ Dynamic library (Mac OS X)

동적 라이브러리가 로드될 때 언로드 될 때 스스로 초기화 해야 할 필요가 있을 때 다음과 같이 작성한다.

__attribute__((constructor))
static void initializer1() {
printf(“[%s] [%s]\n”, FILE, FUNCTION);
}

__attribute__((destructor))
static void finalizer1() {
printf(“[%s] [%s]\n”, FILE, FUNCTION);
}

여러 개의 constructor나 destructor를 작성할 수 있고 로드 혹은 언로드될 때 그 개수만큼 모두 실행된다.

다음은 클래스를 라이브러리에 노출하고 클라이언트에서 생성, 파괴하는 코드이다.


Person.h

class Person {
};

extern “C” Person *NewPerson(void);
typedef Person *Person_creator(void);
extern “C” void DeletePerson(Person *person);
typedef void Person_disposer(Person *);


Person.cpp

#define EXPORT __attribute__((visibility(“default”)))

EXPORT
Person* NewPerson(void) {
    return new Person;
}
EXPORT
void DeletePerson(Person* person) {
    delete person;
}
——————————————————————
Client.cpp
——————————————————————
#include
#include
#include “Person.h”
int main() {
    using std::cout;
    using std::cerr;
    // Open the library.
    void* lib_handle = dlopen(“./libPerson.dylib”, RTLD_LOCAL);
    if (!lib_handle) {
        cerr << dlerror() << “\n”;
    }
    // Get the NewPerson function.
    Person_creator* NewPerson = (Person_creator*)dlsym(lib_handle, “NewPerson”);
    if (!NewPerson) {
        cerr << dlerror() << “\n”;
    }
    // Get the DeletePerson function.
    Person_disposer* DeletePerson =
        (Person_disposer*)dlsym(lib_handle, “DeletePerson”);
    if (!DeletePerson) {
        cerr << dlerror() << “\n”;
    }
    // Create Person object.
    Person* person = (Person*)NewPerson();
    // Use Person object.
    // blah blah blah
    // Destroy Person object.
    DeletePerson(person);
    // Close the library.
    if (dlclose(lib_handle) != 0) {
        cerr << dlerror() << “\n”;
    }
    return 0;
}
도큐멘트 에 올린 글

댓글 남기기