zoukankan      html  css  js  c++  java
  • 开发环境问题

    1.问题单:在使用boost线程库时遇见各种报错信息。

    系统: ubuntu desktop v16.04  boost: v1.67    IDE: Qtcreator v4.5.2 

    使用测试代码如下:

    #include <iostream>
    #include<boost/thread/thread.hpp>
    #include<boost/thread/mutex.hpp>
    
    boost::mutex io_mutex;
    
    struct count
    {
        count(int id):id(id) {}
    
        void operator()()
        {
            for(int i = 0; i < 60; ++i)
            {
                boost::mutex::scoped_lock lock(io_mutex);
                std::cout << id << ": " << i << std::endl;
                sleep(1);
            }
        }
    
    
        int id;
    };
    
    int main()
    {
        boost::thread thrd1(count(1));
        boost::thread thrd2(count(2));
        thrd1.join();
        thrd2.join();
    
        system("pause");
        return 0;
    }

    使用Qt Creator自动进行编译,有许多错误信息,取第一行如下:

    /usr/local/boost/include/boost/system/error_code.hpp:703: error: undefined reference to `boost::system::generic_category()'

    经过google,需要添加boost_system,首先确认自己boost lib的安装位置,在qt的工程文件pro中添加此项:

    LIBS = -L/usr/local/lib -lboost_system

    再次编译,新的错误出现:

    /lib/x86_64-linux-gnu/libpthread.so.0:-1: error: error adding symbols: DSO missing from command line

    提示缺失线程库,继续google,增加boost_thread库

    LIBS = -L/usr/local/lib -lboost_system -lboost_thread

    出现错误如下:

    /lib/x86_64-linux-gnu/libpthread.so.0:-1: error: error adding symbols: DSO missing from command line

    发现与上一个错误信息一样,感觉没有起作用,去掉后想加上以前的标志lpthread试试:

    LIBS = -L/usr/local/lib -lboost_system -lpthread

    结果报错如下:

    /usr/local/boost/include/boost/thread/pthread/thread_data.hpp:155: error: undefined reference to `vtable for boost::detail::thread_data_base'

    网上说要加上boost_thread库,于是不得已,又加上它,变成:

    LIBS = -L/usr/local/lib -lboost_system -lboost_thread -lpthread

    最后终于成功运行,boost_thread与pthread都不能省~,一个小小的库加载来来回回找了许久才解决,打个标记。

    2.部署VS2017+BOOST1.68环境

      下载好VS2017与boost库,安装好VS2017,把boost库解压,进入windows命令,把目录切到boost库下面,直接运行bootstrap.bat文件,大约一分钟后会在boost库目录下生成一批文件,其中包括b2.exe,然后再运行下面一条命令:

    b2.exe install --toolset=msvc-14.1 --prefix="D:/ProgramFiles/boost/lib" --without-python threading=multi --build-type=complete  address-model=64
    

      命令解析如下:

     

    --toolset:设置编译器,如果用VC,设msvc, 用MinGW就设gcc。 
    stage:可选install,选stage只生成库(静态库和动态库),install还包含include目录,其实,可以直接用我们下载下来的BOOST包里的boost目录,这个目录和install生成的include目录内容基本一样。 
    --build-dir=”[temporary folder name”:编译的临时文件存放位置。 
    --stagedir=” stage folder name]”:存放编译后库文件的路径,默认是stage。 
    --build-type=complete:编译所有版本 
    {
      variant=debug|release        决定编译什么版本(Debug or Release?)
      link=static|shared           决定使用静态库还是动态库。
      threading=single|multi       决定使用单线程还是多线程库。
      runtime-link=static|shared   决定是静态还是动态链接C/C++标准库。
    }
    
    link:是动态库还是静态库,static | shared,一般默认静态。
    address-mode:address-model=64,如果没有这个属性的话,会默认生成32位的平台库,加入这个选项才能生成64位的DLL。如果运行在VS32位的命令行下需要添加” architecture=x86”,由于我们使用x64 Native Tools Command Prompt for VS 2017没有x86与x64之间的矛盾,所以未设置。 

      我的个人电脑编译了45分钟左右,最后编译成功,但文件目录生成结构有点不太好,自己把头文件和lib文件分别存放在两个文件夹,设置两个环境变量:

      BOOSTROOT=D:sdkoost

      BOOSTLIB=D:sdkoostlib

      然后使用VS2017创建一个小项目文件测试一下:

    #include <iostream>
    #include<boost/date_time/gregorian/greg_date.hpp>
    
    using namespace std;
    using boost::gregorian::date;
    
    int main(int argc, char* argv[]) {
    
        
        date a{ 2018, 1, 1 }, b{ 2018, 1, 9 };
        std::cout << (b - a).days() << "
    ";
    
        cin.get();
    
        return 0;
    }

      记得在VS2017把项目改成x64并添加boost的库文件和lib文件路径(已设置好的两个环境变量),编译成功,一切OK。

         

  • 相关阅读:
    6174问题
    阶乘的精确值
    小学生算术
    Primer回顾 数组和指针
    Primer回顾 标准库类型
    绪论
    字符串的存储
    条款39:明智而审慎的使用private继承
    条款34:区分接口继承和实现继承
    条款33:避免遮掩继承而来的名称
  • 原文地址:https://www.cnblogs.com/hbright/p/9216711.html
Copyright © 2011-2022 走看看