5

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

对象转换:

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

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

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

暗示:

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

咖啡机库:

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

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

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

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

4

3 回答 3

3

尝试使用implib开关/system

于 2012-11-18T18:39:46.277 回答
1

在 Windows 上,最好使用 dll。省去很多麻烦。

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

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

于 2012-11-19T10:41:45.570 回答
0

为什么您不直接编译 SQLite C 代码并将其与您的 D 应用程序链接?我想这将使您免于与图书馆相关的头痛。

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

于 2012-11-19T10:06:19.420 回答