質問
今日、Dプログラミングについて聞いたところ、Cコードと互換性があると聞きました。それにもかかわらず、GTKやDのPortAudioなどのCライブラリを使用できるかどうかに関する情報は見つかりませんでしたか? 可能であれば、これを行う方法を説明してもらえますか?
解決
DからCライブラリを呼び出すことができます。CヘッダーファイルをDに変換する必要があります。ほとんどの場合、これは非常に簡単で、使いにくいコマンドラインツールでプロセスを自動化できます。おもちゃの例以外は私にとっては本当にうまくいきませんでしたが、実行する必要のある種類の変換を見るには良い出発点になるかもしれません。問題を抱えているスニペットをそれ自体でヘッダーに変換し、htodがそれをどのように処理するかを確認してください。
通常発生する最大の問題は、Cプリプロセッサの創造的な使用です。いくつかのことは、Dではversion()ステートメントに変換できますが、すべてではありません。
実際にコードをコンパイルしてリンクするには、Unixのようなプラットフォームで、GCCを使用してCコードをコンパイルおよびリンクできると思います。 Windowsでは、DMCを使用してCファイルをコンパイルし、DMDとリンクする必要があります。または、それが可能なコンパイラを使用してCコードをDLLにコンパイルし、DMDとリンクするには、DLLからDMD互換のインポートライブラリを作成する必要があります。これは、DigitalMarsから入手できる無料の Basic Utilities Package にあるimplibツールを使用して実行できます。
これらのヘッダー変換の多くはすでに行われています。最初にDsourceの Bindings プロジェクトを参照するか、何かに着手する前に最初にdigitalmars Dニュースグループを尋ねると便利です。 GTKヘッダーを翻訳するような大きな。 GTKのような人気のあるライブラリの多くは既にラップされています(例: GTKD )
他のヒント
DコードはCオブジェクトファイルとリンクでき、C dllと対話できますが、使用するCヘッダーファイルからDモジュールを生成する必要があります。 Dの公式Webサイトには、そのためのガイドがあります。
一般的な代替方法は、実行時にライブラリをロードすることです。 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
Cバインディングを記述する必要があります。 この回答の方法を説明します。
http://dsource.org をご覧ください 始めるのに役立つ多くのプロジェクトがあります