用boost::locale::conv转换字符编码时的坑!

博主在使用Eclipse CDT和MinGW编译网络通讯程序时遇到字符编码转换问题,使用boost::locale::conv进行GBK与UTF-8转换。在家电脑上编译成功,但在单位电脑上出现`libiconv`相关未定义引用的错误。经过排查,发现是链接库顺序导致的问题:将`boost_locale`库放在`iconv`库之前即可解决。此经验教训提醒开发者注意编译器链接库顺序的重要性。

这两天编写一个网络通讯程序的时候,遇到字符编码在GBK和UTF-8之间转换的问题,打算用boost::locale::conv里面的函数来转换。代码很简单,调用boost::locale::conv::between即可。在eclipse cdt中编码,用MinGW作为编译器,在家里的电脑上编译链接调试,一切OK!

第二天,在单位电脑上写了同样的代码,按照同样的方式设定了project属性,链接的时候却出错了,提示:

undefined reference to `libiconv_open'
undefined reference to `libiconv_close'
undefined reference to `libiconv'

看看project属性中关于链接库的设定,所需的libiconv.a库是在库的设定路径中的,看看CDT调用的链接命令如下:

g++ "-LD:\\devlib\\boost\\mingw\\lib" -o studyEncodeConvert.exe main.o -liconv -lboost_locale-mgw10-mt-sd-x64-1_75

说明也调用了iconv库。这就诡异了,明明所需的库都已经在链接命令里得到调用,怎么就还会出现“未定义的引用”这种错误呢?莫非是我编译的boost库有问题?

索性就重新编译了boost,用了各种build指令的组合,折腾了一整天,错误仍旧没有解决。抓狂了!!!丧气了!!!

胡思乱想之下,感觉会不会是CDT调用编译器时有问题?那么换个IDE看看。于是用Code::Blocks重新构造了project,指定了boost_locale-mgw10-mt-sd-x64-1_75,开始编译链接,结果出现前面的错误,看看project的设定,哦哦,忘记指定iconv库了。在project的链接库属性里把iconv加上,build。咦?竟然成功了!C::B里的设定跟CDT里的一样的,咋会成功的?得,仔细对照一下IDE调用编译器的命令行吧。C::B调用的命令行如下:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值