如何在D中使用C静态库?

时间:2011-11-24 06:54:31

标签: linker static-libraries d

我完全不知道如何将FreeType 2.4.8编译为静态库,并且可以从我在Windows中的D应用程序中使用。我尝试使用objconv,coff2omf和尝试extern(C) / extern(System)等来运行它,但似乎没有任何效果。我发现符号未找到错误,访问违规以及一堆无用的错误。

我该如何解决这个问题?我是否正确使用pragma lib链接到我的静态库,以及如何可靠地将COFF静态库转换为DMF / Optlink可以使用的OMF?

编辑:我尝试过的一些例子:

  1. 使用VS 2010将FreeType源编译为静态库,在我的D代码中使用pragma lib进行链接。 (返回“库格式未知”类型错误)
  2. 与上述相同,但使用objconv转换为OMF格式,然后尝试与pragma lib链接。 (已成功链接,但仍无法调用函数。)
  3. 编译了FreeType源代码的DLL,通过implib运行它来创建一个导入库,尝试使用pragma lib进行链接。 (链接成功,但由于“尝试特权功能”或“访问冲突”错误而无法调用任何功能)
  4. 我尝试将函数原型定义为:extern(System),extern(C)和extern(Windows)。第一个和第三个修改外部函数的函数名称,使它们与静态库不匹配,第二个编译,但是在实际尝试调用函数时,我在运行时遇到访问冲突。
  5. 我能够通过动态库和符号加载来实现它,但我更喜欢在部署项目时不需要一堆外部依赖项。

2 个答案:

答案 0 :(得分:1)

我很确定Derelict2有FreeType绑定:http://www.dsource.org/projects/derelict(参见DerelictFT)。

答案 1 :(得分:-1)

是的,你的.d文件中需要extern(System)和FT函数声明。 静态库是对象文件的集合。所以不需要任何类型的转换(omf2coff等)。 DMD接受静态库作为参数,因此简单的dmd file1.d file2.d C:/path/to/freetype.lib应该可以工作。

编辑:

我错了。显然我需要阅读一些关于COFF2OMF的文档。 引用: Microsoft COFF格式显然已随Visual C ++ 6.0更改。要在具有较新格式的.lib文件上使用coff2omf,请使用Microsoft的链接器将文件转换为较早的COFF格式

link /lib /convert freetype.lib

因此,根据上述陈述判断,您需要执行两个步骤。

  1. 首先使用Microsoft的链接器将您使用VisualStudio制作的静态库(COFF格式)转换为 COFF格式,如上所述。

  2. 现在执行coff2omf freetype.lib将静态库转换为OMF格式。

  3. 现在应该可以按照我在帖子中描述的方式与DMD一起使用了。