我正在尝试从cygwin的源代码构建MySQL的“Connector / C”,并且存在问题。
-some context -
我们可以谈论为什么任何人都希望在cygwin中使用libmysql
。在这种情况下,使用cygwin工具集在Windows框中进行一些unix开发会更简单。
根据我的研究,看起来我可以获得一个旧版本(可能是5.1版本)的连接器来构建OK。但是当MySQL开发人员从./configure
切换到cmake
驱动的构建配置时,cygwin支持就会落后。
MySQL提供下载的源tar-ball的版本是6.0.2,这就是我正在处理的版本。
-one(sort-of)解决了问题 -
我遇到的第一个问题是在dtoa()
中发现stdlib.h
的不兼容重新声明。 (许多其他尝试构建各种最新版本的人也遇到了这个问题,如果谷歌是任何指南的话。)网上有各种各样的建议可以解决这个问题。我的选择:暂时将stdlib.h
替换为已移除dtoa()
定义的libmysql
。 Ugly ,是的。但它有效。
(这个'修复'消除了早期编译错误,并且该过程清楚地进行到链接,其中由于显然不相关的原因而失败。)
- 未解决的问题 -
yaSSL
代码依赖于cmake
。即使我提供了-DWITH_OPENSSL=1
openssl-devel
yaSSL
__cxa_pure_virtual()
参数,但 之后我将__cxa_pure_virtual()
包添加到我的环境中并使用cygwin设置工具/包管理器。 yaSSL
似乎正在使用“纯虚拟”类成员。根据我对C ++内部的了解(有些限制),这意味着编译器隐式假设特殊符号/函数__cxa_pure_virtual()
的声明,这会导致链接器搜索{{单个){{1}的定义1}}功能。
构建代码和构建过程的方式,每个extern
源实现文件都被编译为目标文件。其中许多文件引用了另一个定义(即包含extern "C" {
int __cxa_pure_virtual() {
assert("Pure virtual method called." == "Aborted");
return 0;
}
}
的实现的文件。在链接阶段,包含定义的每个对象都相互冲突。 (因为符号定义为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()
我尝试过一些非常简单的尝试来解决这个问题。
inline
的所有定义,但这只是用未定义的引用错误替换了多定义错误。inline
的所有定义都更改为__cxa_pure_virtual()
,徒劳地希望编译器从内联使用的函数中删除外部引用。 (我不确定C ++何时使用查找表作为间接层,但似乎libmysql
在这些情况下可能不是一个选项。)如果我记得该测试的具体结果:它创建了与__cxa_pure_virtual()
的否定义相同的结果。我正在寻找(包括)
之间的选项“介于”之间,因为可能会考虑一些中间替代方案。所以,我看到它的方式,这里最重要的问题是,“对于多重定义错误(在此上下文中)最简单/最简单的修复是什么?”可能紧随其后,“应该将哪些类型的东西反馈给MySQL团队,以便构建过程可以(重新)移植到cygwin?”
- 最终说明 -
如果MySQL的开发人员放弃了对cygwin的支持,我不知道是什么会把他们的注意力带回那个平台。
我希望看到有理由在cygwin中工作的开发人员可以选择针对MySQL连接器的cygwin / unix版本测试他们的代码。
社区中可能存在一些价值,维护知识库至少包含最小的黑客攻击,以使连接器的最新版本(可能还有一些最新版本)在cygwin中有用。迈向这一步的良好的第一步可能是关于stackoverflow的一些讨论,甚至可能作为这个帖子的评论和答案。
答案 0 :(得分:2)
为什么需要使用Cygwin构建的Connector / C? win32 libmysql.dll不正常吗?
要编译的一些想法:
a)你正在尝试使用gcc编译Connector / C作为C ++编译器,最好不要。使用g ++。
b)cmake。 -DSKIP_SSL = 1(查看CMakeLists.txt建议删除yassl)
是的,MySQL已经放弃了cygwin(它现在多年来都不支持它)。我不知道什么可能让Oracle重新启用它,它们目前正在削减平台支持(例如HPUX和AIX被放弃)。另外,就个人而言,我不会在Cygwin端口看到太多价值,它不是最热门的平台,只要您可以使用本机Windows端口。