|
#include <iostream> #include <dlfcn.h> int main() { using std::cout; using std::cerr; cout << "C++ dlopen demo\n\n"; // open the library cout << "Opening hello.so...\n"; void* handle = dlopen("./hello.so", RTLD_LAZY); if (!handle) { cerr << "Cannot open library: " << dlerror() << '\n'; return 1; } // sembolü yükle cout << "Loading symbol hello...\n"; typedef void (*hello_t)(); // hataları resetle dlerror(); hello_t hello = (hello_t) dlsym(handle, "hello"); const char *dlsym_error = dlerror(); if (dlsym_error) { cerr << "Cannot load symbol 'hello': " << dlsym_error << '\n'; dlclose(handle); return 1; } // hesaplama yapmak için kullan cout << "Calling hello...\n"; hello(); // kütüphaneyi kapat cout << "Closing library...\n"; dlclose(handle); }
#include <iostream> extern "C" void hello() { std::cout << "hello" << '\n'; }
Uyarı | |
---|---|
extern "C" tanımlamanın iki değişik biçimi vardır: yukarıdaki gibi extern "C" kullanımı ve küme parantezleri arasında extern "C" { … } biçiminde. İlki (satıriçi biçimi) harici ilintilemeli (extern linkage) ve C dili ilintilemeli bildirimdir; ikincisi sadece dil ilintilemesini etkiler. Bu yüzden aşağıdaki iki bildirim eşdeğerdir:
extern "C" int foo; extern "C" void bar(); ve
extern "C" { extern int foo; extern void bar(); }
extern ve extern olmayan işlev bildirimi arasında fark olmadığından değişken bildirimi yapmadığınız sürece sorun yoktur. Değişken tanımlarsanız şunu aklınızdan çıkarmayın
extern "C" int foo; ile
extern "C" { int foo; } aynı şey değildir.
Daha ileri açıklamalar için 7. bölüme özellikle dikkat ederek [ISO14882] 7.5 bölümüne veya [STR2000], 9.2.4'e bakınız.
Harici (extern) değişkenlerle daha ileri işlemler için Ayrıca bakınız bölümündeki belgeleri inceleyiniz.
|
#include "polygon.hpp" #include <iostream> #include <dlfcn.h> int main() { using std::cout; using std::cerr; // load the triangle library void* triangle = dlopen("./triangle.so", RTLD_LAZY); if (!triangle) { cerr << "Cannot load library: " << dlerror() << '\n'; return 1; } // hataları resetle dlerror(); // sembolleri yükle create_t* create_triangle = (create_t*) dlsym(triangle, "create"); const char* dlsym_error = dlerror(); if (dlsym_error) { cerr << "Cannot load symbol create: " << dlsym_error << '\n'; return 1; } destroy_t* destroy_triangle = (destroy_t*) dlsym(triangle, "destroy"); dlsym_error = dlerror(); if (dlsym_error) { cerr << "Cannot load symbol destroy: " << dlsym_error << '\n'; return 1; } // sınıfın bir örneğini yarat polygon* poly = create_triangle(); // sınıfı kullan poly->set_side_length(7); cout << "The area is: " << poly->area() << '\n'; // sınıfı yoket destroy_triangle(poly); // triangle kütüphanesini boşalt (unload) dlclose(triangle); }
#ifndef POLYGON_HPP #define POLYGON_HPP class polygon { protected: double side_length_; public: polygon() : side_length_(0) {} virtual ~polygon() {} void set_side_length(double side_length) { side_length_ = side_length; } virtual double area() const = 0; }; // sınıf üretiminin türleri typedef polygon* create_t(); typedef void destroy_t(polygon*); #endif
#include "polygon.hpp" #include <cmath> class triangle : public polygon { public: virtual double area() const { return side_length_ * side_length_ * sqrt(3) / 2; } }; // sınıf üretimi extern "C" polygon* create() { return new triangle; } extern "C" void destroy(polygon* p) { delete p; }
|