我有一个在 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) 上运行它:
- 复制 libstdc++.so.6.0.22 到 CentOS 机器
- 更新了 LD_LIBRARY_PATH
- 开始申请
但我知道 libstdc++ 需要 libc.so.6。我在这里停下来是因为当我复制它时,它需要另一个库。
那么,解决方案是什么?有没有办法在我的PC上编译并在应用机器上运行?
最佳答案
您 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 系统上运行的二进制文件,而无需任何新的运行时库。
关于c++ - 为旧的 Linux 环境编译 C++ 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56932755/