我正在尝试从 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-devel
yaSSL
__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()
放在一个独立的目标文件中(然后,我会从每个其他目标文件中删除该定义)。
我正在寻找(包括)之间的选择
- 对项目进行最小修改以使其构建有用的东西,以及
- 使构建过程在所有当前支持的平台和cygwin 上正常工作的正确补丁集。
“Between”是因为可能存在一些应该考虑的中间替代方案。所以,在我看来,这里最重要的问题是,“多定义错误(在这种情况下)的最简单/最简单的修复方法是什么?” 紧随其后的是,“应该将哪些内容反馈给 MySQL 团队,以便构建过程可以(重新)移植到 cygwin?”
-最后的笔记-
如果 MySQL 的开发人员放弃了对 cygwin 的支持,我不知道是什么让他们的注意力重新回到了那个平台上。
我希望看到有理由在 cygwin 中工作的开发人员可以保留针对 MySQL 连接器的 cygwin/unix 构建测试他们的代码的选项。
社区维护一个知识库可能有一些价值,其中至少包含最少的黑客攻击,以在 cygwin 中构建有用的连接器的最新版本(可能还有一些最新版本)。朝着这个方向迈出的一个好的第一步可能是在 stackoverflow 上进行一些讨论,甚至可能作为这个线程的评论和答案。