Win10系统
Qt版本如下所示
Qt中使用的编译器是MinGW,如下图
boost版本是1.82.0
好的,描述一下过程:
按这个教程下载、编译boost,在boost的目录下生成了stage/lib/目录,然后加入到Qt工程里,主要是include目录即为boost目录,lib目录为stage/lib/,然后编译程序运行,先是对这个教程中的两段代码做了测试,都没问题;因为多线程是常用操作,所以我想先把thread也试试,就很简单,代码如下:
#include <iostream>
#include <boost/thread.hpp>
void func()
{
std::cout<<"yeah, boost is well done!"<<std::endl;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
boost::thread tj(func);
tj.join();
return a.exec();
}
然后就怎么也编译不过了,一直undefined reference detach()之类的,总之看起来全是boost::thread库没链接成功的意思;然后就各种方法试了,换lib库(因为同为boost::thread,编译完boost后会生成多个版本)、换pro文件里的写法、手写加库改成操作式加库,还去QQ群里问被人鄙视,但总之没解决。
后来的后来,注意到各个boost库的名字中含有vc142字眼,瞬间恍然,电脑上装着visual studio呢,编译boost不指定toolset它就默认用visual studio的编译器了,而我Qt用的MinGW,怪不得呢,而且Qt有一次的error中还提示了什么incompatible。。。好吧。
然后就是换MinGW编译boost,不过前路依然艰难,当然根本原因还是自己知道的少,走了弯路。一开始指定–toolset=gcc,编译完美滋滋地去找lib了,结果发现全是.a,啥,我不是Windows系统么,怎么给我一堆Linux的库!!又砂岩了(还是知道的少,人家Qt都告诉我了.a在Windows上是可以用的,见下图右下角文件类型过滤器:)(编译前把MinGW的目录加入系统环境变量的Path中)
我总以为是编译命令中gcc的缘故,需要加其它选项让它生成.lib,况且以前印象中gcc可以在Windows中用的啊,真是老糊涂了。看网上说用什么bjam.exe,又一番折腾后认为我的boost版本高了,bjam是老版本的东西,现在统一用b2.exe了,这可如何是好。
可喜的是,意识到.a在Windows上可用后,决定再试一把,这次借鉴了这位老兄的方法来编译,注意命令中一般要显式指定目录,否则它真的默认给你生成到C盘去。
(不过这次编译耗时是真长,比直接b2.exe长多了,不知道是不是编译器的差异造成的)
再然后就是另一个故事了。
解决了boost编译的问题,加到Qt中也能加了,程序也能编译通过了,可特么运行又出了问题。
还是上边那段多线程的代码,因为我在visual studio中也试过,直接一条过,但Qt就是这么糟心;运行起来console cmd里就一句:
Press <RETURN> to close this window...
别的啥也没有,我心想这是什么魔幻,先拿STL的thread试试吧,哎也不行!
(插播一条,按上边代码的写法,其实连这句也没有,把return语句改成平台无关的return 0;这句才出来,但还是没有别的)
又是一通折腾我天哪~~最后在这位仁兄的指引下才算通了关。
#include <boost/thread.hpp>后就一直出这篇文章里黄色的warning,因为是warning就没在意,没想到真就是它的锅。
好了,over,成功打通Windows下Qt中使用boost!