无法在cygwin中从源代码构建mysql connector / c(libmysql)

时间:2011-06-06 22:49:50

标签: mysql build cygwin cmake libmysql

我正在尝试从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()定义相同的结果。
  • 我开始在{{1}}来源中寻找纯虚函数的用法,但这看起来像是一个兔子洞......
  • 考虑研究构建过程,以便将{{1}}的定义放在一个独立的目标文件中(然后,我会从每个其他目标文件中删除该定义)。

我正在寻找(包括)

之间的选项
  1. 项目的最小修改,使其构建有用的东西,
  2. 正确的补丁集,使构建过程在所有当前支持的平台 cygwin上正常工作。
  3. “介于”之间,因为可能会考虑一些中间替代方案。所以,我看到它的方式,这里最重要的问题是,“对于多重定义错误(在此上下文中)最简单/最简单的修复是什么?”可能紧随其后,“应该将哪些类型的东西反馈给MySQL团队,以便构建过程可以(重新)移植到cygwin?”

    - 最终说明 -

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

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

    社区中可能存在一些价值,维护知识库至少包含最小的黑客攻击,以使连接器的最新版本(可能还有一些最新版本)在cygwin中有用。迈向这一步的良好的第一步可能是关于stackoverflow的一些讨论,甚至可能作为这个帖子的评论和答案。

1 个答案:

答案 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端口。