作者:Sam(甄峰) sam_code@hotmail.com
Sam有一个C++程序,其中用到:
std::wstring mbstowcs(std::string str);
使用X5平台的编译器编译时,遇到如下问题:
error: expected constructor, destructor, or type conversion before "mbstowcs"
error: expected `,' or `;' before "mbstowcs"
Sam就开始寻找原因。顺便把gcc,glibc,uclibc,stdc++等东西的概念性东西放在这里。
GCC:gcc(gnu collect compiler)是一组编译工具的总称。它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等。
glibc:glibc是gnu发布的libc库,也即c运行库。glibc是linux系统中最底层的api,几乎其它任何的运行库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现.
uclibc:uclibc是另一c运行库,与glibc对应。它比glibc小。虽然uClibc和Glibc在已有的接口上是兼容的,但有些接口并没有实现。
libstdc++:libstdc++ 是GNU C++ standard Library .
Sam觉得既然编译就通不过,那说明X5的编译器本身就不认识,有可能是X5平台的交叉编译器在创建时没有添加stdc支持?后来觉得不是这样,因为STL完全是以头文件形式提供的。
1.所以只需要指定头文件路径,就应该可以编译。于是Sam添加了:
-I/opt/hisilicon/toolchains/arm-uclibc-linux-soft/include/c++/3.4.3/
(Sam觉得海思的交叉编译器做得不是特别规范,为什么呢。因为它放头文件,库文件的地点多变)
添加这个之后,理论上应该是可以编译了。
可发现还是不认识wstring.
2.于是查看/opt/hisilicon/toolchains/arm-uclibc-linux-soft/include/c++/3.4.3/bits/stringfwd.h。
发现要定义_GLIBCXX_USE_WCHAR_T才会有wstring.
3.于是在编译程序时添加了 -D_GLIBCXX_USE_WCHAR_T
还是通不过,说没有wint_t。
4.于是又查STL. 添加了 -D__WINT_TYPE__
又通不过, 说没有 btowc,Sam查遍了toolchain. 也没找到这个类型的定义。感觉很奇怪,就去查/usr/include. 发现这个类型有定义。但toolchain中没有对应的头文件。
所以,Sam觉得很多做嵌入式程序的工程师都不愿使用STL,喜欢用标准C,是有原因的,因为toolchain限制太大。很多提供toolchain的公司对类似STL的提供都不是很全。
没有评论:
发表评论