c++ - 在 RHEL 7 上编译 mysqlclient 并在 RHEL 6 上运行(Linux 上为 g++)

标签 c++ mysql makefile

我们的业务需要在一个平台上编译我们的软件并在另一个平台上交付。这一直很好,直到我们需要编译 mysqlclient 以连接到数据库。

我想知道是否有其他人尝试过针对 mysqlclient 进行编译并在单独的机器上成功运行。

我们遵循的一些文档: https://dev.mysql.com/doc/refman/8.0/en/c-api-building-clients.html

最终,我们尝试了编译和链接各种不同的方式,并根据我们的尝试得到了不同的错误。我们最远的是完全编译,但是运行程序会给我们这样的东西:

bin/myProgram: /lib64/libc.so.6: version `GLIBC_2.14` not found (required by bin/myProgram)

请注意,我们已经尝试从编译的机器链接并交付 libc.so.6,但我们仍然会出现这样的错误,并且无论如何使用多个版本的某些 STL 文件似乎很危险.

这是我们制作的重现该问题的示例小应用程序的 Makefile:

$(TargetDir)/myProgram: $(OBJS)
  @ echo
  @ echo Linking myProgram
  @ g++ -I /work/mariadb-5.5.53/include \ # Tried various versions of MySQL
    $(OBJS) -o $@ -L/work/mariadb-5.5.53/libmysql -lmysqlclient
  @ echo Build complete!

$(TargetDir)/%.0 : %.C
  @ echo Compiling $(notdir $<)
  @ g++ -I /work/mariadb-5.5.53/include -o $@ -c $<

编辑:我们的团队采纳了下面接受的回复的建议,改为在 RHEL 6 上编译,并使用它来交付。这是成功的,我们现在可以继续前进了。

我们如何使用上面的 Makefile 进行编译:$ make -s -C src

最佳答案

I'm wondering if anyone else has attempted to compile towards mysqlclient and run on a separate machine with success.

人们经常这样做。它是 RPM 等打包系统的基础。人们也为不同的系统这样做,这被称为“交叉编译”。

不太常见的是为具有给定操作系统的一个版本的系统编译并期望结果在具有该操作系统的较早版本的系统上运行。在某些情况下可行,但想要在不单独编译的情况下支持操作系统的多个版本的人通常通过编译较早版本而不是后者来实现。这会减少兼容性问题,而且出现的问题通常更容易解决。

Note that we've tried linking towards and delivering the libc.so.6 from the machine that was compiled on, but we still give errors like this, and it seems dangerous anyways to have multiple versions of some STL files in use.

将所有需要的共享库与可执行文件一起交付是一种可行的替代方法——实际上可能需要与为早期操作系统版本而不是更高版本构建一起构建,但它不一定足以只需从构建主机复制共享库二进制文件。可执行文件和它所依赖的库,递归地,都需要在运行时动态链接到它们所需库的正确版本。这些以不提供从非标准路径链接库的方式构建的情况并不少见。

另一种选择是执行全静态链接。这会产生(大得多)更大的可执行文件,但它们不依赖于主机系统的库。尽管系统调用仍然存在潜在问题,但此类二进制文件更有可能在目标操作系统的旧版本上运行。

最可靠的替代方案,至少对于编译软件而言,是在您希望支持的最早操作系统上构建并执行静态链接。

如果你正在交付一堆使用相同库的可执行文件,并且你想通过使用共享库来节省空间,那么最好还是在你想要支持的最早系统上构建,并将结果与​​共享库打包该操作系统版本的库(可能涉及调整或重建某些库)。

关于c++ - 在 RHEL 7 上编译 mysqlclient 并在 RHEL 6 上运行(Linux 上为 g++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57260152/

相关文章:

mysql - 判断MySQL是否安装了InnoDB插件

c - make 文件中所需的帮助

c++ - 如何使用glCreateShaderProgram?

c++ - 为什么有 boost::noncopyable 类

php - MySQL 选择函数

php - 搜索过滤器,我应该在客户端还是服务器端进行?

c++ - 编译时如何更改makefile诊断消息[GNU ARM GCC,Eclipse make.exe]

c++ - Makefile 错误导致对符号 'GOMP_parallel@@GOMP_4.0' 的 undefined reference

c++ - char * 的初始化 vector 对我的电脑做了疯狂的事情

c++ - C++ streambuf 方法可以抛出异常吗?