【问题标题】:compile C++ application for old Linux environment为旧的 Linux 环境编译 C++ 应用程序
【发布时间】:2019-07-08 10:13:49
【问题描述】:

我有一个在 CentOS Linux 6.6 上运行的 C++ 应用程序,这台机器包含两个版本为 4.4.7 和 4.9.3 的 GCC。

我开始使用 Mozilla SpiderMonkey JS 引擎 60,其中我需要将我的一些 std::string 转换为 std::u16string,我使用了他们在示例中提供的方式:

static inline std::u16string StringtoU16(const std::string &str) {
    std::u16string wstr = u"";
    char16_t c16str[3] = u"\0";
    mbstate_t mbs;
    for (const auto& it : str) {
        memset(&mbs, 0, sizeof (mbs)); //set shift state to the initial state
        memmove(c16str, u"\0\0\0", 3);
        mbrtoc16(c16str, &it, 3, &mbs);
        wstr.append(std::u16string(c16str));
    }//for
    return wstr;
}

但是,当我开始在前面提到的环境上构建应用程序时,我发现<uchar.h> 没有找到。

但是当我使用 GCC 6.3.0 在我的 PC 上构建它时,代码运行良好。

我搜索了其他方法来进行转换Convert between string, u16string & u32string,但它在我的机器上运行良好,但在我得到<codecvt> 的应用程序机器上找不到。

我尝试获取在我的 PC (GCC 6.3.0) 上构建应用程序的输出,并使用以下过程在应用程序机器 (CentOS 6.6) 上运行它:

  1. 将 libstdc++.so.6.0.22 复制到 CentOS 机器上
  2. 更新了 LD_LIBRARY_PATH
  3. 启动应用程序

但我知道 libstdc++ 需要 libc.so.6。我停在这里是因为当我复制它时,它需要另一个库。

那么,解决方案是什么?有什么办法可以在我的PC上编译并在app机器上运行吗?

【问题讨论】:

  • 我知道这很有争议,但您可以尝试将相关库静态链接到您的构建中。
  • 请参阅this SO 关于静态链接的问题:“您有一个文件可以复制到任何具有兼容架构和操作系统的机器上,无论如何它都可以正常工作安装的库的版本。"

标签: c++ spidermonkey


【解决方案1】:

您的 CentOS 机器上的旧 GCC 版本不支持您尝试使用的 C++11 功能。

我建议的解决方案是从软件集合中的开发人员工具集中安装 devtoolset-8-gcc-c++ 软件包(有关设置说明,请参阅 https://www.softwarecollections.org/en/scls/rhscl/devtoolset-7/ —— devtoolset-8-gcc 的过程与 devtoolset-7-gcc 的过程相同)。

这将安装一个更新的 GCC,可用于在 CentOS 机器上编译 C++11 代码,生成可在旧 CentOS 系统上运行的二进制文件,而无需任何新的运行时库。

【讨论】:

    【解决方案2】:

    另一个解决方案(如果Jonathan one 不起作用)是学习如何构建GCC(Gnu 编译器集合)-即几个编译器 - 和 install 来自其源代码


    我有一些在 CentOS Linux 6.6 上运行的 C++ 应用程序,这台机器包含两个版本为 4.4.7 和 4.9.3 的 GCC。

    请注意,GCC 4.4 和 4.9已过时,且未由 FSF 维护。


    首先,从源代码成功构建 GCC 需要相当长的时间(以及几 GB 的磁盘空间)。在功能强大的 PC 上可能需要几个小时(主要是 CPU)时间(您可能需要至少 32 GB 的 RAM,因为直接(非 cross)GCC 编译器是 bootstrapped 并使用 LTO)。

    这种方法有利有弊。专业人士是直接的:一旦你学会了如何从它的源代码编译 GCC,你可以在它发布后立即获得最新的releaseGCC 9,2019 年 7 月),并且该版本很可能支持大部分最新的C++ language standards(以及几个新的,如 Go 或 D)和越来越花哨的optimizations 针对最近的处理器(可能是动态的你当前的处理器)。缺点包括学习 configuration 过程(相当复杂,因为 GCC 有许多可调功能,花里胡哨)当然还要等待几个小时才能完成构建。

    因此,您需要做出权衡。你愿意花几个小时来学习如何构建 GCC。

    使用gcc -v(或gcc-8 -v,如果您的 GCC 被配置为安装为gcc-8 ....)获得已安装 GCC 的配置,并且可以启发新的配置下载 GCC。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多