c++ - 为旧的 Linux 环境编译 C++ 应用程序

标签 c++ spidermonkey

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

我开始使用 Mozilla SpiderMonkey JS 引擎 60,我需要在其中转换我的一些 std::stringstd::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上编译并在应用机器上运行?

最佳答案

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

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

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

关于c++ - 为旧的 Linux 环境编译 C++ 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56932755/

相关文章:

javascript - Spidermonkey 中的 JSON 序列化

javascript - SpiderMonkey 堆栈跟踪中的函数名称

c++ - "if"和 "else if"命令在 c++ 中不起作用

c++ - 为什么模板只能在头文件中实现?

c++ - 在 luabind 中返回指向派生对象的指针时出现泄漏问题或 'unregistered class'

javascript - 如何在 Spidermonkey 中创建、处理和销毁 JS::Heap<T> 对象?

javascript - 全局对象在 Spidermonkey 中意味着什么? JS_class 和 JS_NewGlobalObject 的作用是什么?

c++ - 避免编译开销

c++ - 在 C++11 中初始化 C++ std::array of struct

c++ - 用父类(super class)的实例覆盖子类的实例