[解決済み] LinuxにおけるC++ダイナミックシェアードライブラリ
質問
の続報です。 g++での動的共有ライブラリのコンパイル .
LinuxでC++の共有クラスライブラリを作成しようとしています。 私はライブラリをコンパイルすることができ、私が見つけたチュートリアルを使用して、いくつかの(非クラス)関数を呼び出すことができます。 こちら と こちら . 私の問題は、ライブラリに定義されているクラスを使おうとしたときに始まります。 私がリンクした2番目のチュートリアルでは、ライブラリで定義されたクラスのオブジェクトを作成するためのシンボルをロードする方法が紹介されていますが、その前に 使用 そのオブジェクトを使用して、何らかの作業を行うことができます。
共有C++クラスライブラリを作成するための、より完全なチュートリアルをご存知の方はいらっしゃいますか? 使用 を別の実行ファイルで使用できますか? オブジェクトの作成、使用(単純なゲッターとセッターで結構です)、削除を示す非常にシンプルなチュートリアルがあれば素晴らしいです。 共有クラスライブラリの使用を説明するオープンソースコードへのリンクや参照も同様に良いだろう。
の回答がありましたが コードロジック と ニムロドム は動作しますが、私はただ、私が拾ったのは Linuxプログラミング入門 この質問をしてから、その最初の章にC言語のサンプルコードと、静的ライブラリと共有ライブラリの両方の作成と使用に関する良い解説があります。 これらの例は、Googleブック検索で その本の古い版 .
解決方法は?
myclass.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の場合、でコンパイルします。
g++ -dynamiclib -flat_namespace myclass.cc -o myclass.so
g++ class_user.cc -o class_user
Linuxの場合、でコンパイルします。
g++ -fPIC -shared myclass.cc -o myclass.so
g++ class_user.cc -ldl -o class_user
これがプラグインシステムであれば、MyClassをベースクラスとして、必要な機能をすべてvirtualに定義することになる。プラグイン作成者は、MyClassを派生させ、仮想関数をオーバーライドして
create_object
と
destroy_object
. メインアプリケーションは、何も変更する必要はありません。
関連
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] Linux上で動作するC++コードのプロファイリングを行うにはどうすればよいですか?
-
[解決済み] LinuxのシェルスクリプトでYes/No/Cancelの入力を促すにはどうしたらいいですか?
-
[解決済み] Linux で grep を使ってファイル名だけを表示するにはどうしたらいいですか?
-
[解決済み] ダイナミックライブラリとスタティックライブラリの使い分け
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】共有オブジェクト(.so)、静的ライブラリ(.a)、DLL(.so)の違い?)
-
[解決済み] cmakeで共有ライブラリを作成する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】'cout'は型名ではない
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較