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

Linker 如何在D中使用C静态库?,linker,static-libraries,d,Linker,Static Libraries,D,如何将FreeType 2.4.8编译为静态库,并在Windows中的D应用程序中使用,这让我感到十分困惑。我试着用objconv、coff2omf运行它,并尝试extern(C)/extern(System)等等,但似乎没有任何效果。我发现了符号未找到错误、访问冲突和一些无用的错误 我怎样才能解决这个问题?我使用pragma lib链接到我的静态库是否正确,以及如何可靠地将COFF静态库转换为DMD/Optlink可以使用的OMF 编辑:我尝试过的一些例子: 将VS2010作为静态库编译Fre

如何将FreeType 2.4.8编译为静态库,并在Windows中的D应用程序中使用,这让我感到十分困惑。我试着用objconv、coff2omf运行它,并尝试
extern(C)
/
extern(System)
等等,但似乎没有任何效果。我发现了符号未找到错误、访问冲突和一些无用的错误

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

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

  • 将VS2010作为静态库编译FreeType源代码,在MyD代码中链接pragma库。(返回“库格式未知”类型错误)
  • 同上,但使用转换为OMF格式,然后尝试与pragma lib链接。(链接成功,但仍无法调用函数。)
  • 编译了FreeType源代码的DLL,通过implib运行它以创建导入库,尝试链接到pragma lib。(链接成功,但由于“尝试使用特权函数”或“访问冲突”错误,无法调用任何函数)
  • 我尝试将函数原型定义为所有函数:extern(系统)、extern(C)和extern(窗口)。第一个和第三个会损坏外部函数的函数名,使它们与静态库不匹配,第二个会编译,但当我实际尝试调用函数时,在运行时会遇到访问冲突 我可以通过动态库和符号加载让它工作,但我更希望在部署我的项目时不需要一堆外部依赖项。

    是的,您需要在.d文件中使用带有FT函数声明的extern(System)。 静态库对象文件的集合。因此不需要任何类型的转换(omf2coff等)。DMD接受静态库作为参数,因此simple
    DMD file1.d file2.dc:/path/to/freetype.lib
    应该可以工作

    编辑: 我错了。很明显,我需要阅读一些关于这个项目的文档。 <强>引用:微软COFF格式明显改变了Visual C++ 6。要在更新格式的.lib文件上使用coff2omf,请使用Microsoft的链接器将文件转换为早期的COFF格式:

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

  • 首先使用Microsoft的链接器将使用VisualStudio(COFF格式)创建的静态库转换为旧的COFF格式,如上所述

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

  • 它现在应该准备好与DMD一起使用了,就像我在文章中最初描述的那样


  • 我很确定Derelict2有FreeType绑定:(参见DerelictFT)。

    你能给我们举一个你尝试过的最简单的例子吗?e、 g.声明一个函数原型,并用示例程序演示您得到的错误。此外,如果您向我们展示您使用静态库(尝试将其从COFF转换为OMF)所做的尝试,那么这也会有所帮助。当然,让我举一些例子。Windows上的静态库可能是一个PITA。最简单的方法是始终使用动态库+implib。如果使用C++,那么创建的DLL会工作吗?如果是,你能显示你的C++和D代码吗?请注意,extern(System)在Windows上表示extern(Windows),在Linux上表示extern(C)。如果构建静态FreeType库,只需将其添加到源文件列表中即可。示例:
    dmdfile1.dfile2.dc:/dev/proj/freetype.lib
    @DejanLekic:祝你好运。GDC二进制文件需要“libcloog-0.dll”,这在4.5.2 TDM bundle安装程序中找不到。更不用说TDM页面上指向单个软件包的链接有一半已经失效。他在OP中说,他在尝试链接时出现了“库格式未知”错误。错误的是,他使用VS编译,因此得到了一个COFF库,而dmd只接受蹩脚的OMF格式。公平的说,我很久没有做Windows编程了。。。是时候我再次开始这样做了。:)感谢大家的支持。我如何获得Microsoft链接实用程序的副本?链接是链接器。它必须是任何Microsoft(R)Visual C++(TM)发行版的一部分。它也应该是PSDK的一部分。是的,但是他们使用动态库,而且他们使用的FreeType版本已经很过时了(我相信是2.3.5,而FreeType目前是2.4.8)。看来你是对的,它已经过时了。有一个古老的FreeType绑定仍然存在:所以OP可以看看他们是如何使用DLL的。静态链接可能会很困难,因为DMD使用OMF。最可靠的方法是通过DMC编译FreeType。也许这是可能的。否则OP可能会显示他正在使用的代码,以便我们知道问题是在DLL还是调用代码中。或者,忘记在Windows上使用DMD而使用GDC编译器?
    link /lib /convert freetype.lib