gpt4 book ai didi

mysql - 无法从cygwin中的源代码构建mysql连接器/c(libmysql)

转载 作者:行者123 更新时间:2023-11-29 02:35:13 25 4
gpt4 key购买 nike

我试图在cygwin中从源代码构建MySQL的“Connector/C”,但存在一些问题。
-一些背景-
我们可以谈论很多人为什么要在cygwin中使用libmysql。在这种情况下,使用cygwin工具集在windows平台上进行unix开发更简单。
从我的研究来看,我可以得到一个旧版本(5.1,也许)的连接器来构建OK。但是,当MySQL开发人员从./configure驱动的构建配置切换到cmake驱动的构建配置时,cygwin的支持逐渐消失。
MySQL提供下载的源tar-ball版本是6.0.2,所以这就是我正在研究的版本。
-一个(某种)已解决的问题-
我遇到的第一个问题是在dtoa()中发现了一个不兼容的stdlib.h重新声明。(许多其他人试图构建各种最新版本,也遇到了这个问题,如果谷歌是任何指南的话。)有各种各样的建议潜伏在网上解决这个问题。我的选择:暂时将stdlib.h替换为已删除dtoa()定义的。丑陋,真实。但它起作用了。
(这个“修复”消除了一个早期的编译错误,整个过程运行到链接,在链接中由于明显无关的原因失败。)
-未解决的问题-
libmysql代码依赖于yaSSL。尽管我给了cmake参数,但情况似乎是这样的,只有在使用cygwin安装工具/包管理器将-DWITH_OPENSSL=1包添加到我的环境中之后,才能接受该参数。openssl-devel似乎在使用“纯虚拟”类成员。从我的(有限的)C++内部结构的知识来看,这意味着编译器隐式地假设特殊符号/函数yaSSL的声明,这会导致链接器搜索__cxa_pure_virtual()函数的(单个)定义。
按照代码和构建过程的结构,每个__cxa_pure_virtual()源实现文件都被编译成一个对象文件。其中许多文件引用了另一个定义(即包含的实现)yaSSL。在链接阶段,包含定义的每个对象彼此冲突。(因为符号被定义为__cxa_pure_virtual(),或者更具体地说:

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

这些定义位于共享命名空间中。因此,链接器没有给定规则来决定从每个引用链接到哪个引用。)结果是a extern,例如:
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

我试过一些非常简单的方法来解决这个问题。
我删除了 multiple definition error的所有定义,但这只是将多个定义错误替换为未定义的引用错误。
我把 __cxa_pure_virtual()的所有定义都改成了 __cxa_pure_virtual(),但希望编译器能从内联使用的函数中删除外部引用,这是徒劳的。(我不确定C++何时使用查找表作为间接的一层,但似乎 inline在这些情况下可能不是一种选择。)如果我记得那个测试的具体结果:它创建了与不定义 inline的相同结果。
我开始在 __cxa_pure_virtual()源代码中寻找纯虚拟函数的用法,但那看起来像一个兔子洞。。。
我考虑研究构建过程,以便将 libmysql的定义放在一个独立的对象文件中(然后,我将从每个其他对象文件中删除该定义)。
我在(包括)之间寻找选择
对项目的最小修改,使其构建有用的内容,以及
使生成过程在所有当前支持的平台和cygwin上正常工作的正确修补程序集。
“介于”是因为可能有一些中间的替代方案需要考虑。所以,在我看来,这里最重要的问题是,“对于多重定义错误(在这种情况下)最简单/最容易的修复方法是什么?”可能紧跟其后的是,“什么样的东西应该反馈给MySQL团队,以便构建过程可以(重新)移植到cygwin?”
-最后说明-
如果MySQL的开发人员已经放弃了cygwin支持,我不知道什么会让他们的注意力回到这个平台上。
我希望有理由在cygwin中工作的开发人员可以保留根据MySQL连接器的cygwin/unix构建测试代码的选项。
在社区中维护一个知识库可能有一些价值,至少包含一组最基本的黑客,以使连接器的最新版本(可能还有一些最新版本)在cygwin中有效地构建。朝着这个方向迈出的第一步可能是在stackoverflow上进行一些讨论,甚至可以作为这个主题的注释和答案。

最佳答案

为什么需要用Cygwin构建Connector/C?普通的win32 libmysql.dll不够吗?
让它编译的一些想法:
A:您正在尝试以GCC作为C++编译器编译连接器/ C,最好不要使用C++。
b)克马克。-DSKIP_SSL=1(查看CMakeLists.txt表明它将删除yassl)
是的,MySQL已经放弃了cygwin(而且它已经很多年不支持它了)。我不知道是什么让Oracle重新启用它,他们目前正在削减平台支持(例如HPUX和AIX被放弃)。我个人也不认为Cygwin端口有多大价值,它不是最热门的平台,只要你能使用本地Windows端口。

关于mysql - 无法从cygwin中的源代码构建mysql连接器/c(libmysql),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6258898/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com