동적 라이브러리가 로드될 때 언로드 될 때 스스로 초기화 해야 할 필요가 있을 때 다음과 같이 작성한다.
__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;
}
댓글 남기기