Cで書かれたサードパーティのライブラリAPIをDに翻訳しています。そのライブラリはlibname_foofunc
、libname_barfunc
などの名前の関数をたくさんエクスポートしています。これは、Cライブラリがグローバル名前空間の肥大化を防ぐために期待できます。D は C よりもモジュール化されているため、より D っぽいインターフェイスを提供し、関数のプレフィックスを取り除きたいので、関数は and のようlibname.c.foofunc
になりlibname.c.barfunc
ます。
ライブラリは私の「改善」を認識していないため、何らかの方法で変換libname.c.foofunc
しlibname_foofunc
、正しい extern-linkage、宛先名マングリング、および呼び出し規約を同時に保持する必要があります。
__imp__D1c7foofuncFZi
外部の未解決のシンボルが対応することをリンカに伝える方法があると仮定すると(私も知りません)、_libname_foofunc
またはlibname_foofunc@0
(手で名前マングリングをしなければならないという事実にもかかわらず)、呼び出し規約が何であるかをDに伝える問題がまだあります。
で明示的に指定extern(C) int foofunc()
した場合libname/c.di
、呼び出し規約の問題はなくなりましたが、名前が に変換され_foofunc
、これも予想とは異なります。
では、エクスポートされたものとは異なる名前で外部関数をインポートする方法はありますか?
関数を元の名前で「そのまま」インポートしてから、それらを接頭辞のない類似体にエイリアスすることについては考えましたが、これはかなり不器用なようです。