编译boost

来源:互联网 发布:想做个网络作家 编辑:程序博客网 时间:2024/06/16 14:05

编译boost

首先下载源代码包,解压之后,先得生成bjam——boost的构建工具。windows下

  • 如果已经安装了msvc,则只需运行一下bootstrap.bat,就会生成bjam.exe和project-config.jam这两个文件。
  • 如果用mingw的话,需要自己手动生成bjam.exe:去boost/tools/jam/src,执行build.bat gcc,即设置默认编译器为gcc。注意直接修改boost/bootstrap.bat 里的内容set toolset=gcc没有作用。如果成功,在bin.ntx86目录下将会生成bjam.exe,拷贝至boost根目录。

project-config.jam中指定了bjam要用的toolset,最常用的包括:msvc,gcc这两个。

比如我要用mingw编译boost,那么就得把project-config-jam中内容修改为using gcc ;注意gcc后面留有一个空格,然后才是分号。少了这个空格,会报文件EOF语法错。默认生成的是using msvc ;

 

另一种方法是在bjam命令行中指定编译工具。bjam toolset=msvc-9.0 注意不能写成vc9,使用bjam --help,查看所有bjam选项:

bjam [options] [properties] [install | stage]

 

  • --build-type options 如果不指定的话,默认是只编译静态库的debug版和release版,而不会去生成动态库。要想生成动态库可以设置--build-type=complete 
  • variant properties 指定要生成debug版还是release版还是两者都debug|release。
  • link properties 指定生成静态库还是动态库还是两者都static|shared。
  • runtime-link properties 指定是静态还是动态链接c/c++运行库static|shared。

不是所有的模块都需要单独编译,有的只需包含头文件即可使用。但是包含头文件即可使用也不意味着就不需要依赖库,比如asio,它依赖system模块, 如果用到跟正则表达式有关的函数还需要regex模块等等。

可单独编译的库有:

date-time, filesystem, graph,graph_parallel, iostreams, math, mpi, program_options,python,random, regex, serialization, signals, system, test, thread, wave.

其他的库不需单独编译,直接使用。比如asio,如果试图单独编译asio库,bjam --with-asio,则会报wrong library name错误。

不常用的库也可不编译,比如graph, graph_parallel, mpi, program_options, python, 使用选项--without-xxx。

 

bjam --build-type=complete toolset=gcc --without-graph --without-graph_parallel --without-math --without-mpi --without-program_options --without-python --without-serialization --without-test --without-wave

boost库的命名约定:

[lib]<boost模块名>-<toolset编译器>[-mt][-sgdyp]<-boost版本>.<扩展名>

  • [lib]:所有模块均采用lib为前缀,除了windows+msvc环境。在windows+msvc环境下,只有静态库(.lib)才有lib前缀,动态库(.dll)没有lib前缀。windows+mingw环境也使用lib前缀。
  • <boost模块名>:所有模块均以boost_开头,比如boost_date_time, boost_python等等
  • <toolset编译器>:比如mgw45, vc90
  • [-mt]:多线程支持,不指定则默认为仅支持单线程
  • [-sgdyp]:ABI的详细情况
    • s 静态链接到C++标准库和运行库
    • g 使用debug版的标准库和运行库
    • d 编译debug版
    • y python相关的debug
    • p 使用STLPort作为C++标准库而不是编译器默认提供的
  • <-boost版本>:比如-1_45
  • <扩展名>:
    • windows+mingw:dll(动态库),dll.a(动态库的导入库)
    • windows+msvc:dll(动态库),lib(无lib前缀的是动态库的导入库),lib(有lib前缀的是静态库)
    • unix/linux:a(静态库),so(动态库)

使用boost

  • windows+msvc编译出来的boost库默认会打开auto-link功能,即在包含boost头文件的时候自动寻找并链接依赖库。这实际上是通过msvc特有的预处理指令#pragma comment(lib, "xxx.lib")来实现的,默认的实现为链接静态库。
    • 如果想要链接动态库,则需要使用预定义宏 -DBOOST_ALL_DYN_LINK
    • 如果想要完全手动控制链接方式,则需要使用预定义宏 -DBOOST_ALL_NO_LIB。
  • windows+mingw编译出来的boost库不支持auto-link,因为gcc没有类似msvc的#pragma comment预处理指令,所以必须手动控制链接方式。
  • asio:依赖Boost.system模块,并且如果用到特定功能还可能依赖Boost.regex, Boost.openssl, Boost.thread, Boost.date_time, Boost.serialization等等,可以使用预定义宏 -DBOOST_DATE_TIME_NO_LIB 以及 -DBOOST_REGEX_NO_LIB 关闭相应模块的自动链接。windows下asio最终使用的是windows系统的socket库:ws2_32.lib,Mswsock.lib.同理,msvc可以通过auto-link自动完成链接,mingw需要手动设置。

[cpp] view plaincopy
  1. #include <iostream>  
  2. #include <boost/asio.hpp>  
  3. #include <boost/date_time/posix_time/posix_time.hpp>  
  4. using namespace std;  
  5. int main() {  
  6.     cout<<"begin"<<endl;  
  7.     boost::asio::io_service io;  
  8.     boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));  
  9.     t.wait();  
  10.     cout<<"end"<<endl;  
  11.     return 0;  
  12. }  
 

上述代码,都依赖哪些boost模块呢?

 

使用msvc编译真是有些玄妙:

使用预定义宏BOOST_ALL_DYN_LINK,动态链接:则编译时需要动态链接库导入库system,date_time,regex,执行时需要system,date_time。

使用预定义宏BOOST_ALL_NO_LIB,动态链接:则编译时需要动态链接库导入库system,执行时也只需要system。

使用预定义宏BOOST_ALL_NO_LIB,静态链接:则编译时需要静态库system,执行时不需要system。

 

使用mingw编译,一切正常:

注意上述几个预定义宏只对msvc有用而对mingw是不起作用的

动态链接:则编译时需要动态链接库导入库system,执行时也只需要system

静态链接:则编译时需要静态库system,执行时不需要system

当然ws2_32, Mswsock总是要指定链接的。

原创粉丝点击