bjam 参数

bjam 参数


典型的参数
bjam --toolset=msvc-8.0 --with-date_time --with-thread  --link=static --threading=multi --runtime-link=shared debug stage

为了方便,你还可以这样:

bjam --with-date_time --build-type=complete --toolset=msvc-8.0 stage

注意,--build-type=complete表示生成debug release static shared的各种版本

还有一个非常需要注意的地方,我在一次编译的时候遇见过很变态的问题,由于安装了VS2008,所以我想用VC9来编译,结果VC9的设置似乎与环境变量冲突,在打开命令行工具的时候会提示:此时不应有:<此处为系统的所有环境变量>。这个奇怪的问题很可能是由于环境变量里的路径过长或包含不该有的符号而导致的,但奇怪的是,VS2005并没有这个冲突问题。所以,这时候如果要编译boost的话只有两条路走:1、搞定VS2008的冲突,重装环境变量里路径过长的程序。2、用VS2005的命令行工具去编译。顺带一提的是,这时候最好不要用系统中的cmd,而是在开始->程序->VS2005->工具->命令提示里执行bjam的工作。

其他参考:

bjam参数 --build-dir=<builddir> 编译的临时文件会放在builddir里(这样比较好管理,编译完就可以把它删除了) 
--stagedir=<stagedir> 存放编译后库文件的路径,默认是stage 
--build-type=complete 编译所有版本,不然只会编译一小部分版本(确切地说是相当于:variant=release, threading=multi;link=shared|static;runtime-link=shared) 
variant=debug|release 决定编译什么版本(Debug or Release?) 
link=static|shared 决定使用静态库还是动态库。 
threading=single|multi 决定使用单线程还是多线程库。 
runtime-link=static|shared 决定是静态还是动态链接C/C++标准库。 
--with-<library> 只编译指定的库,如输入--with-regex就只编译regex库了。 
--show-libraries 显示需要编译的库名称

libboost_regex-vc71-mt-d-1_34.lib 为例:

·         lib 
前缀:除了Microsoft Windows之外,每一个Boost库的名字都以此字符串开始。在Windows上,只有普通的静态库使用lib前缀;导入库和DLL不使用。

·         boost_regex 
库名称:所有boost库名文件以boost_开头。

·         -vc71 
Toolset
标记:标识了构建该库所用的toolset和版本。

·         -mt 
Threading
标记:标识构建该库启用了多线程支持。不支持多线程的库没有-mt

·         -d 
ABI
标记:编码了影响库和其他编译代码交互的细节。对于每一种特性,向标记中添加一个字母: 

Key

Use this library when:

s

静态链接到C++标准库和编译器运行时支撑库

g

使用标准库和运行时支撑库的调试版本

y

使用Python的特殊调试构建

d

构建代码的调试版本

p

使用STLPort标准库而不是编译器提供的默认库

n

使用STLPort已被弃用的“native iostreams”

·         -1_34 
版本标记:完整的Boost发布号,下划线代替点。例如,1.31.1版本将被标记为“-1_31_1”

·         .lib 
扩展名:取决于操作系统。在大多数unix平台上,.a是静态库,.so是共享库。在Windows上,.dll表示共享库,.lib是静态或导入库。

 

下表是对Regex库编译后的文件名:

文件名

含义

编译使用该库的程序时应使用的编译选项

libboost_regex-vc90-mt-sgd-1_38.lib

静态库,多线程,调试版本 
使用静态调试版本C运行时库(LIBCMTD.LIBLIBCPMTD.LIB

/MTd

libboost_regex-vc90-mt-s-1_38.lib

静态库,多线程 
使用静态版本C运行时库(LIBCMT.LIBLIBCPMT.LIB

/MT

libboost_regex-vc90-mt-gd-1_38.lib

静态库,多线程,调试版本 
使用动态调试版本C运行时库(MSVCRTD.LIBMSVCPRTD.LIB

/MDd

libboost_regex-vc90-mt-1_38.lib

静态库,多线程 
使用动态版本C运行时库(MSVCRT.LIBMSVCPRT.LIB

/MD

boost_regex-vc90-mt-gd-1_38.lib

导入库(boost_regex-vc90-mt-gd-1_38.dll),多线程,调试版本

 

boost_regex-vc90-mt-1_38.lib

导入库(boost_regex-vc90-mt-1_38.dll)多线程

 

 

需要注意的是,链接时,所使用的Regex库文件名必须和编译选项匹配,否则会造成如下链接错误:

LINK : warning LNK4098: defaultlib '×××××' conflicts with use of other libs; use /NODEFAULTLIB:library

原因是,当编译时, cl.exe (也就是 VC 的编译器)会根据上述编译选项在编译成的 obj 文件中植入相应的 defaultlib 文件名(使用 DUMPBIN /DIRECTIVE ***,lib 可以查看),如 /MT 对应的就是 LIBCMT.LIB C )和 LIBCPMT.LIB C++ 标准库)。当链接器处理该 obj 文件时,会从文件中取出该 defaultlib 文件名,将其放在命令行库列表的最后以供使用。对于静态库的处理也是如此,静态库也是由一些 obj 文件组成的,每个 obj 文件中也根据当时的编译选项被植入了相应的 defaultlib 。当链接器处理静态库时,也会将涉及到的 obj 文件中的 defaultlib 放在命令行库列表的最后。假设,我们的程序使用 /MT 编译,那个对应的 defaultlib 就是 LIBCMT.LIB C )和 LIBCPMT.LIB C++ 标准库)。而使用的是 libboost_regex-vc90-mt-sgd-1_38.lib ,它对应的 defaultlib 就是 LIBCMTD.LIB LIBCPMTD.LIB 。链接过程中,链接器会发现采用了不同的运行时库,所以会出现上述错误。





你可能感兴趣的:(bjam 参数)