SORU
30 Ocak 2009, Cuma


C Linux üzerinde Dinamik Paylaşılan Kitaplık

Bu bir takip Dynamic Shared Library compilation with g .

Linux shared C sınıfı bir kütüphane oluşturmaya çalışıyorum. Derleme kitaplığı almak mümkün değilim, ve (sınıf dışı) fonksiyonları here here bulduğum öğreticiler kullanarak bazı arayabilirim. Sorunlarımı kütüphanede tanımlanan sınıfları kullanmaya çalıştığımda başlayın. Bağlı olan ikinci eğitim sınıfları kitaplığı içinde tanımlanan nesneleri oluşturmak için simgeleri yüklemek için nasıl gösterir, ama kısa dururkullanarakbu nesneler herhangi bir iş halletmek için.

Herkes de gösterilmiştir paylaşılan C sınıf kitaplıkları oluşturmak için daha kapsamlı bir öğretici biliyor mukullanınayrı bir yürütülebilir dosya olarak, bu sınıflar? Nesne oluşturma, kullanma (basit alıcıları ve ayarlayıcıları iyi olurdu) ve silme gösteren basit bir öğretici harika olurdu. Paylaşılan bir sınıf kütüphane kullanımını gösteren bazı açık kaynak kod için bir bağlantı veya referans de aynı derecede iyi olur.


Ancak cevapları codelogic nimrodm iş, ben sadece eklemek aldım kopya Beginning Linux Programming beri sorduğum soru bu, ve ilk bölüm olan örnek C kodu ve iyi açıklamalar oluşturma ve kullanarak statik ve paylaşılan kitaplıklar. Bu örnekler an older edition of that book Google Kitap Arama ile kullanılabilir.

CEVAP
30 Ocak 2009, Cuma


sınıfım.h

#ifndef __MYCLASS_H__
#define __MYCLASS_H__

class MyClass
{
public:
  MyClass();

  /* use virtual otherwise linker will try to perform static linkage */
  virtual void DoSomething();

private:
  int x;
};

#endif

myclass.cc

#include "myclass.h"
#include <iostream>

using namespace std;

extern "C" MyClass* create_object()
{
  return new MyClass;
}

extern "C" void destroy_object( MyClass* object )
{
  delete object;
}

MyClass::MyClass()
{
  x = 20;
}

void MyClass::DoSomething()
{
  cout<<x<<endl;
}

class_user.cc

#include <dlfcn.h>
#include <iostream>
#include "myclass.h"

using namespace std;

int main(int argc, char **argv)
{
  /* on Linux, use "./myclass.so" */
  void* handle = dlopen("myclass.so", RTLD_LAZY);

  MyClass* (*create)();
  void (*destroy)(MyClass*);

  create = (MyClass* (*)())dlsym(handle, "create_object");
  destroy = (void (*)(MyClass*))dlsym(handle, "destroy_object");

  MyClass* myClass = (MyClass*)create();
  myClass->DoSomething();
  destroy( myClass );
}

Mac OS X üzerinde, derleme:

g   -dynamiclib -flat_namespace myclass.cc -o myclass.so
g   class_user.cc -o class_user

Linux üzerinde, derleme:

g   -fPIC -shared myclass.cc -o myclass.so
g   class_user.cc -ldl -o class_user

Eğer bu eklenti bir sistem olsaydı, bir temel sınıf Sınıfım kullanın ve gerekli tüm fonksiyonları sanal tanımlarsınız. Eklenti yazarı sonra Sınıfım kaynaklanıyor, sanal olanı geçersiz kılmak ve create_object destroy_object uygulamaya koyacak. Ana uygulama herhangi bir şekilde değiştirilmesi gerekir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Justin Schenck

    Justin Schen

    24 Kasım 2006
  • Missouri Star Quilt Company

    Missouri Sta

    18 ŞUBAT 2009
  • Ordetta Price

    Ordetta Pric

    12 EYLÜL 2011