テストコードでインポートして使用する共有オブジェクト(つまり、Windows dllのLinux版)があります。
これはこれほど単純ではありません;)しかし、これは私がやりたいことの一種です。
#include "headerforClassFromBlah.h"
int main()
{
load( "blah.so" );
ClassFromBlah a;
a.DoSomething();
}
これは本当に基本的な質問だと思いますが、私がWebを検索しているときに飛び出すものは何も見つかりません。
C++で共有オブジェクトをロードする方法は2つあります
これらのいずれの方法でも、使用するオブジェクトのヘッダーファイルが常に必要です。ヘッダーには、コードで使用するクラスまたはオブジェクトの定義が含まれます。
静的に:
#include "blah.h"
int main()
{
ClassFromBlah a;
a.DoSomething();
}
gcc yourfile.cpp -lblah
動的(Linuxの場合):
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("libm.so", RTLD_LAZY);
if (!handle) {
fprintf (stderr, "%s\n", dlerror());
exit(1);
}
dlerror(); /* Clear any existing error */
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fprintf (stderr, "%s\n", error);
exit(1);
}
printf ("%f\n", (*cosine)(2.0));
dlclose(handle);
return 0;
}
* dlopen Linux man page から盗まれたWindowsまたは他のプラットフォームでのプロセスは同じです。dlopenを動的シンボル検索のプラットフォームバージョンで置き換えてください。
動的メソッドが機能するためには、インポート/エクスポートするすべてのシンボルが外部リンクされたCリンケージを持っている必要があります。
静的リンクを使用する場合と動的リンクを使用する場合について、いくつかの単語 ここ があります。
それはプラットフォームに依存します。実行時にそれを行うには、Linuxでは dlopen を使用し、Windowsでは LoadLibrary を使用します。
コンパイル時にこれを行うには、Windowsで dllexport および dllimport を使用して関数名をエクスポートします。 Linuxでは、gccはすべてのパブリックシンボルをエクスポートするため、通常の方法でリンクして関数を呼び出すことができます。どちらの場合も、通常、ヘッダーファイルにシンボル名を付けて#include
、コンパイラの機能を使用してライブラリにリンクします。
ClassFromBlahなどの宣言を取得するには、共有ライブラリに関連付けられているヘッダーを#includeする必要があります。次に、.soに対してリンクする必要があります。これを行う方法は、コンパイラと一般的なインストールによって異なりますが、g ++の場合は次のようになります。
g++ myfile.cpp -lblah
おそらく動作します。
Libblah.aのようなアーカイブファイルをリンクするのは-lです。または、gccに-PICを追加すると、「共有オブジェクト」ファイルlibblah.soを取得します(それをビルドするのはリンカーです)。私は一度太陽を持っていて、このタイプのファイルを構築しました。ファイルには、正確またはそれ以上のリビジョン番号が必要です(バグが原因でコードが変更されている可能性があります)。ただし、パラメーターを使用した呼び出しは、出力と同じでなければなりません。