2

我正在尝试从 cygwin 中的源代码构建 MySQL 的“连接器/C”,但存在问题。

-一些上下文-

我们可以谈论很多关于为什么有人想要libmysql在 cygwin 中使用。在这种情况下,使用 cygwin 工具集在 windows 机器上进行一些 unix 开发会更简单。

从我的研究来看,我似乎可以获得连接器的旧版本(可能是 5.1)来构建 OK。./configure但是,当 MySQL 开发人员从驱动构建配置切换到驱动构建配置时,对 cygwin 的支持就落后了cmake

MySQL 提供下载的源 tar-ball 版本是 6.0.2,所以这是我正在研究的版本。

-一个(某种)解决的问题-

我遇到的第一个问题是dtoa()stdlib.h. (许多其他试图构建各种最新版本的人也遇到了这个问题——如果谷歌有任何指导的话。)网上有各种各样的建议来解决这个问题。我的选择:暂时替换为删除stdlib.h了定义的那个。,真的。但它有效dtoa()

(这个“修复”消除了早期的编译错误,并且该过程清楚地运行到链接,由于明显不相关的原因它失败了。)

-一个未解决的问题-

libmysql代码依赖yaSSL于. 即使我提供cmake-DWITH_OPENSSL=1参数,情况似乎也是如此,只有在我使用 cygwin setup-tool/package-manager将包添加到我的环境后才接受该参数。似乎正在使用“纯虚拟”类成员。根据我对 C++ 内部结构的(有些有限的)了解,这意味着编译器隐式假定特殊符号/函数的声明,这会导致链接器搜索函数的(单个)定义。openssl-develyaSSL__cxa_pure_virtual()__cxa_pure_virtual()

代码和构建过程的结构方式是,每个yaSSL源实现文件都被编译成一个目标文件。其中许多文件引用另一个定义(即包含实现)的文件__cxa_pure_virtual()。在链接阶段,每个包含定义的对象都相互冲突。(因为符号被定义为extern,或更具体地说:

extern "C" {
  int __cxa_pure_virtual() {
    assert("Pure virtual method called." == "Aborted");
    return 0;
  }
}

这些定义位于共享命名空间中。因此,没有给链接器一个规则来决定从每个引用中链接到哪一个。)结果是 a multiple definition error,例如:

CMakeFiles/libmysql.dir/__/extlib/yassl/taocrypt/src/algebra.cpp.o:algebra.cpp:(.text+0x40): multiple definition of `___cxa_pure_virtual'
CMakeFiles/libmysql.dir/__/extlib/yassl/taocrypt/src/aes.cpp.o:aes.cpp:(.text+0x0): first defined here

我尝试了一些非常简单的尝试来解决这个问题。

  • 我删除了的所有定义,__cxa_pure_virtual()但这只是用未定义的引用错误替换了多定义错误。
  • __cxa_pure_virtual()我徒劳地更改了to的所有定义,inline希望编译器会从内联使用的函数中删除外部引用。(我不确定 C++ 何时使用查找表作为间接层,但inline在这些情况下似乎不是一个选项。)如果我记得该测试的具体结果:它创建的结果与没有定义相同的__cxa_pure_virtual()
  • 我开始在源代码中寻找纯虚拟函数的用途,libmysql但这似乎是一个兔子洞......
  • 考虑研究构建过程,以便将定义__cxa_pure_virtual()放在一个独立的目标文件中(然后,我会从每个其他目标文件中删除该定义)。

我正在寻找(包括)之间的选择

  1. 对项目进行最小修改以使其构建有用的东西,以及
  2. 使构建过程在所有当前支持的平台cygwin 上正常工作的正确补丁集。

“Between”是因为可能存在一些应该考虑的中间替代方案。所以,在我看来,这里最重要的问题是,“多定义错误(在这种情况下)的最简单/最简单的修复方法是什么?” 紧随其后的是,“应该将哪些内容反馈给 MySQL 团队,以便构建过程可以(重新)移植到 cygwin?”

-最后的笔记-

如果 MySQL 的开发人员放弃了对 cygwin 的支持,我不知道是什么让他们的注意力重新回到了那个平台上。

我希望看到有理由在 cygwin 中工作的开发人员可以保留针对 MySQL 连接器的 cygwin/unix 构建测试他们的代码的选项。

社区维护一个知识库可能有一些价值,其中至少包含最少的黑客攻击,以在 cygwin 中构建有用的连接器的最新版本(可能还有一些最新版本)。朝着这个方向迈出的一个好的第一步可能是在 stackoverflow 上进行一些讨论,甚至可能作为这个线程的评论和答案。

4

1 回答 1

2

为什么需要使用 Cygwin 构建的 Connector/C?难道普通的win32 libmysql.dll就够了吗?

编译它的一些想法:

a)您正在尝试使用 gcc 作为 C++ 编译器来编译 Connector/C,最好不要。使用 g++。

b)cmake 。-DSKIP_SSL=1(查看 CMakeLists.txt 表明它将删除 yassl)

是的,MySQL 已经放弃了 cygwin(而且它已经多年不支持它了)。我不知道是什么能让 Oracle 重新启用它,他们目前正在削减平台支持(例如 HPUX 和 AIX 已被放弃)。另外我个人认为 Cygwin 端口没有多大价值,它不是最热门的平台,只要您可以使用原生 Windows 端口即可。

于 2011-06-06T23:40:53.170 回答