静态链接SQLite和DMD(Windows x86)

时间:2012-11-18 18:30:21

标签: windows sqlite d dmd

我试图与sqlite3静态链接但没有成功。我正在使用'etc.c.sqlite3'标题和sqlite3合并。为了创建.lib文件,我尝试了VC ++和MinGW-gcc,这两个文件都成功编译了源文件 - 但它们都生成COFF对象格式(optlink,DMD使用,与OMF一起使用)。在阅读了'digitalmars.D'上的大量帖子后,我尝试了几种不同的解决方案。

objconv:

  • 尝试转换用GCC创建的lib文件,导致未定义的符号,如__divdi3和__muldi3,无法解决此问题。

  • 还尝试将sqlite3.o文件转换为* .obj,然后使用digitalmars'lib.exe' - 也不成功

  • 在VC ++生成的lib上尝试objconv失败,原因是:“SQLite.lib是一个导入库”

implib:

  • 如果我从sqlite.org下载预编译的DLL并使用implib,它会生成一个lib文件,但名称mangling似乎不匹配,因为即使我链接到静态库,我仍然会收到相同的sqlite错误(例如,未定义的符号_sqlite3_open_sqlite3_errmsg_sqlite3_close ...

coffimplib:

  • 如果我在VC ++创建的库文件中使用coffimplib,程序会生成一个几乎为空的文件(~2KB),它只包含垃圾(即根本没有符号,大多数只是'null'值)。

  • 如果我对GCC创建的库执行相同操作,coffimplib会抱怨“不是导入库”,并且不会生成转换后的库文件。

如果我使用DMC编译sqlite3合并,则编译失败会抱怨错误。所以我在这里,无处可去,是否有人有任何想法或提示可以解决这个问题?

注意:我不想使用DLL,而是静态链接sqlite(对于可执行文件大小的问题)。

3 个答案:

答案 0 :(得分:3)

尝试将implib/system切换一起使用。

答案 1 :(得分:1)

在Windows上,你最好使用dll。给你带来很多麻烦。

正在进行x64支持工作,我认为它将利用COFF + VC的链接器。 这有望改变尴尬局面。

编辑:如果你真的需要静态库,你可以尝试Unilink,它可以将OMF和COFF文件链接在一起: ftp://ftp.styx.cabel.net/pub/UniLink

答案 2 :(得分:0)

为什么你根本不编译和链接SQLite C代码与你的D应用程序?我想这样可以避免与图书馆相关的麻烦。

当然,一个很好的选择是使用DMC编译SQLite静态库,并将其与D项目一起使用,只需执行以下操作:dmd -of myproggy myproggy.d somefile.d libsqlite.lib