【问题标题】:Developing C++ applications, target server has different std lib versions, what are best practices开发C++应用程序,目标服务器有不同的std lib版本,什么是最佳实践
【发布时间】:2019-09-03 10:18:33
【问题描述】:

问题的狭义版本:问题是我正在开发 C++ 应用程序,使用 GNU libc 2.28、GCC 版本 8.3 和我的目标服务器 (RHEL 6.5) 的笔记本电脑 (Fedora 29) ) 是 GNU libc 2.12,GCC 版本 4.47。由于监管问题,服务器与我的开发环境位于不同的网络上,因此在笔记本电脑和服务器之间移动文件需要使用拇指驱动器并手动移动它们。

如果我在笔记本电脑上编译二进制文件并将其部署到服务器,我会收到与不同 glibc 版本相关的错误。我敢肯定会有更多的问题,因为操作系统是如此不同,所以我只是在我的笔记本电脑上编写代码,确保它可以编译,然后在其中一台服务器上编译并分发。没关系。但是,问题之一是在我的笔记本电脑上编译c++0x 时可以使用一些c++11 功能,但它在服务器上不可用,所以我必须修复服务器上的代码以确保它编译然后通过它回到我的笔记本电脑,所以我可以更新源代码。这很乏味。

我想让它达到这样的程度服务器。我抓取了 glibc、gcc、stdlibc++、gcc-c++ 和其他一些库的 RPM 文件以匹配服务器上的内容。

更广泛的版本: 使用不同标准库版本的 C++ 目标系统开发的最佳实践是什么?它只是安装目标系统的虚拟机并在那里完成我所有的工作吗?或者我可以通过并排安装相同的库版本来让它足够接近吗?似乎大多数人都已经知道这些东西,而我的知识可能存在巨大差距,如果是这样的话,是否有任何浓缩的参考资料可以指出?

【问题讨论】:

  • Docker,也许?
  • 顺便说一句,窄版已经相当宽泛了;)
  • 拥有一个虚拟机/本地测试系统 ID 说是必须的。虽然您当然可以在本地开发一些东西,但最终直接从本地桌面部署到安全的生产系统可能不是最好的主意,迟早有些东西不会工作,然后您似乎没有简单的调试方法?跨度>
  • 根据目标系统的性质,交叉编译也是一种可行的解决方案。
  • Docker 似乎是这里的最佳选择——澄清一下,在您的笔记本电脑上,而不是在目标服务器上。仅在 glibc 和编译器版本不同的 Linux 平台之间进行交叉编译可能会很痛苦,因为很少有人会这样做。

标签: c++ toolchain


【解决方案1】:

根据 cmets 中的讨论,有 3 个主要选项。

交叉编译;这是最难设置且最容易出错的,这就是它在很大程度上被归入嵌入式应用程序的原因。

Docker(容器);最简单的方法,只需创建一个与您的部署服务器匹配的容器,编译容器中的代码,然后可以将二进制文件部署到服务器。但是,Docker 在容器中使用宿主机内核,因此可能会创建不兼容的二进制文件。

虚拟机;与 Docker 相比,需要做更多的设置工作,但是因为它有自己的内核,所以创建不兼容的二进制文件的机会更少。使用 vagrant,它实际上和 Docker 一样容易设置,但我确实遇到了一些虚拟机失败但没有真正错误消息的地方;但对于大多数人来说,它“只是有效”。

我最终选择了 Docker,它运行良好,而且很容易设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多