最近在做一个linux-arm平台的项目时,遇到如如下错误
error:locale::facet::_S_create_c_locale name not valid
按照网上的找到所有答案都是要为主机添加语言支持,可是对于我们来说,程序是在客户的设备上跑的,要求用户添加特定的设置并不现实。
通过反复查找,定位到下面的代码,是一个将字符串转大写的模板函数:
template<typename E,
typename TR = std::char_traits<E>,
typename AL = std::allocator<E>>
inline std::basic_string<E, TR, AL> toupper(const std::basic_string<E, TR, AL>&src) {
auto dst = src;
static const std::locale loc("");
transform(src.begin(), src.end(), dst.begin(), [&](E c)->E {return std::toupper(c, loc); });
return dst;
}
这个代码我在windows-x86-64,linux-x86-64,android-arm平台能正常运行,唯独在linux-arm上跑出上面的问题。
如这个代码std::locale loc("")
std::locale对象是传了一个空字符串来构造的.既然提示name not valid(名字无效),应该就是指输入的空字符串做参数不对喽。
又查了一下std::locale是有默认构造函数的。于是将上面的代码改为
static const std::locale loc;
问题解决,修改后的代码其他平台(windows-x86-64,linux-x86-64,android-arm)也没有问题.
我已经忘记当初为啥要填个空字符串做参数了.
在Linux ARM平台上遇到locale::facet::_S_create_c_localenamenotvalid错误,原因是代码中std::locale使用空字符串构造。通过查阅资料发现std::locale有默认构造函数,修改代码为不传参数的默认构造,问题得到解决。此解决方案适用于多种平台且不影响其他平台的正常运行。
5903





