【问题标题】:Problems converting a C header to D将 C 标头转换为 D 的问题
【发布时间】:2011-03-05 14:40:27
【问题描述】:

我正在尝试将 MySql C 连接器 6.02 标头转换为 D,但我遇到了一些奇怪的崩溃。 我的猜测是我在翻译结构或函数时犯了一些错误(我不太擅长 C)。

我在 libmysql.dll 上使用 implib /system 创建了一个 lib 文件。

我无法让 htod.exe 工作。使用 -hs(包括系统文件)抱怨找不到系统文件。

Coffimlib.exe 没有在导出的内部名称前添加 _ 的选项。

我找不到免费版的 coff2omf。

mysql.d 是包装器。我在每个包装定义之前都包含了 C 定义,以便更容易发现错误。该文件还包括mysql dll和转换后的libfile。

在编译 mytest_fails.d 时它会崩溃。 mytest_works.d 只有一个断言,这使它可以工作。使用 -release 编译 mytest_works 也会使其崩溃。

我一直在使用 dmd 2.051

Download mytest.zip from share1t.com

更新:我还在 D.learn 新闻组上问过一些关于此的问题,但我认为没有人看过代码。

【问题讨论】:

  • 另外请注意,htod 很乐意丢弃 constness 和被预处理器停用的东西(即 #if VERFOO ... 未转换为版本(VERFOO)...)您也可以尝试 SWIG 或dsource.org/projects/visuald/browser/trunk/c2d 转换 C 头文件。
  • @Trass3r:我忘了提,但是 swig 刚刚崩溃了。

标签: mysql c d


【解决方案1】:

stdcall 是 Windows 函数调用约定(与 C 调用约定非常不同)。 HTOD 未能用 extern(Windows) 标记多个函数。这是正常的,因为没有配备 HTOD 来处理宏(STDCALL 被定义为宏,我可以从 msyql.d 中剩余的 cmets 中看到)。

这是一个更新的 mysql.d 文件: http://dl.dropbox.com/u/9218759/mysql.d

现在,您需要正确的 OMF 格式的导入库。我通常建议您不要为此使用 implib。我遇到了几个问题,其他人报告说使用它有问题。使用 coffimlib 是要走的路。但首先,您需要一个 COFF 导入库。

如果您需要,可以从这里下载带有 COFF 导入库的 Mysql 版本:http://dev.mysql.com/downloads/mirror.php?id=377977#mirrors(标记为 Visual Studio 的 DLL 形式的库通常带有 COFF 导入库)。

但我在这里为您提供 OMF 格式的翻译后的 COFF 导入库:http://dl.dropbox.com/u/9218759/libmysql.lib

我已经尝试了您的两个测试用例,现在它们似乎都可以正常工作。如果出现问题,请尝试再次检查翻译后的头文件(mysql.d),我可能错过了正确指定所有调用约定。

【讨论】:

  • 谢谢!我无法让 htod 工作,所以这完全是我的失败。我会在今天或明天为您提供解决方案。顺便提一句。您是如何创建 OMF 库的?你买了coff2omf吗?还是你有其他工具?
  • 你可以在这里找到 coffimlib:digitalmars.com/d/archives/c++/announce/864.html
  • 谢谢一百万。像魅力一样工作。我仍然遇到一些奇怪的事情,但这可能只是mysql的一些不清楚的文档。
  • 你的 Dropbox 链接给了我一个 404,你能把它放回去吗?
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2011-05-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多