29

インポートしてテストコードで使用したい共有オブジェクト(つまり、Linux版のWindows dll)があります。

これほど単純なことではないと思います;)しかし、これは私がやりたいことのようなものです。

#include "headerforClassFromBlah.h"

int main()
{
    load( "blah.so" );

    ClassFromBlah a;
    a.DoSomething();
}

これは本当に基本的な質問だと思いますが、ウェブを検索しているときに飛び出すものは何も見つかりません。

4

4 に答える 4

48

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;
}

* dlopenLinuxのマニュアルページから盗まれた Windowsまたはその他のプラットフォームでのプロセスは同じです。dlopenをプラットフォームバージョンの動的シンボル検索に置き換えるだけです。

動的メソッドが機能するには、インポート/エクスポートするすべてのシンボルに外部Cリンケージが必要です。

静的リンクを使用する場合と動的リンクを使用する場合について、ここにいくつかの単語があります。

于 2009-07-17T09:06:33.777 に答える
7

プラットフォームによって異なります。実行時にこれを行うには、Linuxではdlopenを使用し、WindowsではLoadLibraryを使用します。

コンパイル時にこれを行うには、Windowsで、dllexportdllimportを使用して関数名をエクスポートします。Linuxでは、gccはすべてのパブリックシンボルをエクスポートするため、通常どおりにリンクして関数を呼び出すことができます。どちらの場合も、通常、これにはヘッダーファイルにシンボルの名前が含まれている必要があります。その後#include、コンパイラの機能を使用してライブラリにリンクします。

于 2009-07-17T08:56:27.307 に答える
5

ClassFromBlahのようなものの宣言を取得するには、共有ライブラリに関連付けられているヘッダーを#includeする必要があります。次に、.soに対してリンクする必要があります。これを行う方法は、コンパイラと一般的なインストールによって異なりますが、g++の場合は次のようになります。

g++ myfile.cpp -lblah

おそらく動作します。

于 2009-07-17T08:57:33.450 に答える
0

libblah.aのようなアーカイブファイルをリンクするのは-lです。または、-PICをgccに追加すると、「共有オブジェクト」ファイルlibblah.so(それを構築するリンカー)を取得します。私は一度SUNを持っていて、このタイプのファイルをビルドしました。ファイルには、正確以上のリビジョン番号を付けることができます(バグのためにコードが変更されている可能性があります)。ただし、パラメーターを使用した呼び出しは、出力と同じである必要があります。

于 2017-07-10T12:31:04.130 に答える