2009-10-27 13 views
17

今日、私はDプログラミングについて聞きましたが、それはCコードと互換性があります。それにもかかわらず、DからGTKやPortAudioのようなCライブラリを使用することが可能かどうかについての情報はありませんでしたか? 可能であれば、これを行う方法を説明できますか?DのCライブラリの使い方は?

答えて

18

DからCライブラリを呼び出すことができます。CヘッダファイルをDに変換する必要があります。ほとんどの場合、これはかなり簡単で、難しいです。command-line toolプロセスを自動化します。おもちゃの例以外は私のためには本当に働いたことはありませんが、行う必要がある変形の種類を見るのは良いスタートになるかもしれません。スニペットを置くだけで、ヘッダー自体に翻訳するのが難しくなり、htodがそれで何をするのか見ることができます。

あなたが通常直面する最大の問題は、Cプリプロセッサの独創的な使用です。いくつかはDのversion()ステートメントに変換できますが、すべてではありません。

実際にコードをコンパイルしてリンクするのは、UNIX系のプラットフォームでは、GCCを使用してCコードでコンパイルしてリンクすることができると思います。 Windowsでは、DMCを使用してCファイルをコンパイルし、DMDとリンクする必要があります。または、それを可能にする任意のコンパイラを使用してCコードをDLLにコンパイルし、DMDとリンクするには、DLLからDMD互換のインポートライブラリを作成する必要があります。これは、DigitalMarsから入手可能な無料のBasic Utilities Packageにあるimplibツールを使用して行うことができます。

すでにこれらのヘッダー変換が多数行われています。最初にDsourceのBindingsプロジェクトを参照するか、GTKヘッダーの翻訳のような大きなものに着手する前に、デジタルマルサスのDニュースグループを最初に尋ねると便利です。

4

DコードはCオブジェクトファイルとリンクでき、C DLLと対話できますが、使用するCヘッダーファイルからDモジュールを生成する必要があります。その公式Dウェブサイトには、そのことを行うためのa guideがあります。

1

で始める取得するために役立つかもしれない多くのプロジェクトがあります:GTKのような人気のライブラリの多くは、すでに(GTKD例えばここでは)ラップされています。 This answer説明方法

4

人気のある代替方法は、実行時にライブラリをロードすることです。ここでのlibpngをロードしてのlibpng関数を呼び出す方法の例です:

module libpngtest; 

import std.stdio; 
import core.sys.posix.dlfcn; 

alias uint function() png_access_version_number_t; 

int main() { 
    auto lib = dlopen("libpng.so".ptr, RTLD_LAZY | RTLD_LOCAL); 
    if (lib is null) { 
    writeln("EEEK!"); 
    writeln(to!string(dlerror())); 
    return -1; 
    } else { 
    writeln("WOOT!"); 
    auto png_access_version_number = cast(png_access_version_number_t)dlsym(lib, "png_access_version_number"); 
    writeln(png_access_version_number()); 
    } 

    if (dlclose(lib) == 0) { 
    return 0; 
    } else { 
    return -1; 
    } 
} // main() function 

// compile: dmd libpngtest.d -L-ldl 
// run:  ./libpngtest 

はそれをテストするためにDPasteを使用します。http://www.dpaste.dzfl.pl/917bc3fb

関連する問題