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

C++ 在RHEL 7上编译mysqlclient并在RHEL 6上运行(在Linux上为g+;+;),c++,mysql,makefile,C++,Mysql,Makefile,我们的业务需要在一个平台上编译软件,然后在另一个平台上交付。在我们需要编译mysqlclient以连接到数据库之前,这一切都很好 我想知道是否有其他人试图编译mysqlclient并在另一台机器上成功运行。 我们遵循的一些文件: 最终,我们尝试了编译和链接各种不同的方法,并根据我们的尝试得到不同的错误。我们所能做的最远的事情是完全编译,但运行程序会给我们带来如下结果: bin/myProgram: /lib64/libc.so.6: version `GLIBC_2.14` not found

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

我想知道是否有其他人试图编译mysqlclient并在另一台机器上成功运行。

我们遵循的一些文件:

最终,我们尝试了编译和链接各种不同的方法,并根据我们的尝试得到不同的错误。我们所能做的最远的事情是完全编译,但运行程序会给我们带来如下结果:

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 $<
$(TargetDir)/myProgram:$(OBJS)
@回音
@回音链接程序
@g++-I/work/mariadb-5.5.53/include\#尝试了不同版本的MySQL
$(OBJS)-o$@-L/work/mariadb-5.5.53/libmysql-lmysqlclient
@回声构建完成!
$(TargetDir)/%.0:%.C
@echo编译$(notdir)$
我想知道是否有其他人试图编译mysqlclient并在另一台机器上成功运行

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

不常见的情况是,为具有给定操作系统的一个版本的系统进行编译,并期望结果能够在具有该操作系统早期版本的系统上工作。在某些情况下,这可以工作,但希望支持操作系统的多个版本而无需单独编译的人通常通过为早期版本进行编译来实现,n这会带来更少的兼容性问题,并且出现的问题通常更容易解决

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

提供所有需要的共享库以及可执行文件是一种可能有效的替代方案——实际上可能需要与早期操作系统版本的构建结合使用,而不是后期版本,但仅从构建主机复制共享库二进制文件并不一定足够。可执行文件及其所依赖的库递归地都需要在r处动态链接及时获取所需库的正确版本。以不提供从非标准路径链接库的方式构建这些库并不罕见

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

最可靠的替代方案(至少对于已编译的软件而言)是在您想要支持的最早的操作系统上构建和执行静态链接


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

我们的团队采纳了您的建议,转而使用RHEL 6进行编译。这已经奏效,我们现在可以继续前进。感谢您的详细回复!一般回答:安装虚拟机监控程序,设置与目标尽可能匹配的虚拟机,在那里编译。