今日、D プログラミングについて聞いたことがあります。それは C コードと互換性があります。それにもかかわらず、GTK や PortAudio などの C ライブラリを D から使用できるかどうかについての情報は見つかりませんでした。可能であれば、その方法を説明していただけますか?
5 に答える
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 ツールを使用して行うことができます。
また、これらのヘッダーの翻訳がすでに行われているものもたくさんあります。GTK ヘッダーの翻訳などの大きな作業に着手する前に、まず DsourceのBindingsプロジェクトを参照するか、digitalmars D ニュースグループで質問することをお勧めします。GTK のような人気のあるライブラリの多くはすでにラップされています (例: ここではGTKD ) 。
D コードは C オブジェクト ファイルとリンクでき、C dll と対話できますが、使用する C ヘッダー ファイルから D モジュールを生成する必要があります。公式の D Web サイトには、まさにそれを行うためのガイドがあります。
Popular alternative is to load the library during the run-time. Here is an example how to load libpng and call a libpng function:
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
Use the DPaste to test it: http://www.dpaste.dzfl.pl/917bc3fb
http://dsource.orgを見てみましょ う。始めるのに役立つプロジェクトがたくさんあります。