boost156編譯
A. 如何編譯libboost
您好,這樣的:
1、當前boost最新版本為1.55,下載地址http://sourceforge.net/projects/boost/files/boost/1.55.0/
或者從官網(www.boost.org)下載最新版的BOOST源碼,經過測試,2012和2013步驟相同,這里以2012為例。
2、打開VS2012 Native Tools Command,可以從開始--Microsoft Visual Studio 2012找到:將下載的 boost_1_55_0.zip 解壓在F盤,例如 F:\boost_1_53_0,執行bootstrap.bat。
3、編譯,可以簡單的使用b2 install,也可以指定存放目錄,或者尋找網上其它幫助文章。
查看幫助可以輸入:.\b2 --help
比如要開啟多線程編譯:b2 install threading=multi
設置生成的是debug或者release
備註:如果是使用VS2013,請指定輸出庫類型,否則會缺一個lib文件:
"無法打開文件 libboost_thread_vc120_mt_sgd-1_55.lib"。
在2013時,我是使用下面的語句進行編譯:
// 如果要獲取動態庫:
bjam install stage --toolset=msvc-12.0 --stagedir="C:\Boost\boost_vc_120" link=shared runtime-link=shared threading=multi debug release
// 如果是要獲取靜態庫:
bjam install stage --toolset=msvc-12.0 --stagedir="C:\Boost\boost_vc_120" link=static runtime-link=static threading=multi debug release
其中,注意修改--toolset=msvc-12.0,將12.0修改成對應的vs版本號,12.0是VS2013的版本號。
目標地址也要修改成你所需的。
注意,不要漏了install,它會幫你把頭文件集合到一個文件夾中。
編譯過程有一個復制過程,編譯需要的時間比較長,本次編譯過程中,會在C盤根目錄下生成一個boost文件夾,然後包含include和lib文件夾,這就是我們將要使用的頭文件和庫文件。
4、編譯完了我們就使用編譯在C盤中的文件。我將它們拷貝到了F盤,
需要簡單的配置兩個地方:這里使用絕對路徑,也可以配置環境來使用。
5、然後建立了一個工程測試。 在BoostTest中新建一個控制台應用程序,下圖三個文件分別是:
1) 將要使用的boost頭文件和庫文件。 2) 解壓出的boost文件夾,就是使用這個文件夾來進行 1 -- 3步驟的。 3)BoostTest 測試工程。
#include <iostream>
#include <boost/thread/thread.hpp>
void hello()
{
std::cout << "Hello world, I'm a thread!" << std::endl;
}
int main()
{
boost::thread thrd(&hello);
thrd.join();
}
編譯測試工程, 並運行,開始boost之旅吧。
B. 安裝了多個版本vs怎麼編譯boost
boost有些庫是不用安裝的,僅需包含頭文件庫就行了。
但是有些很爽的庫(thread,regex)需要根據不同的系統做不同的調整,所以必須編譯。
編譯的流程很簡單,如果是windows操作系統,首先找到那個booststrap.bat的東西,然後在控制台下運行它,它會生成bjam.exe,然後就可以通過bjam來編譯boost庫了,在命令行下輸入bjam --help看選項。
如果嫌麻煩,可以一次將boost庫需要編譯的全部編譯了,bjam --build-type=complete,生成庫全在stage目錄下。
C. linux下G++怎麼編譯使用Boost庫的程序
首先把Boost庫的頭文件存放到/usr/include/boost/路徑下,再把Lib文件存放到/usr/local/lib/boost/路徑下。修改/etc/profile文件,在此文件中增加如下2個環境變數:
BOOST_INCLUDE=/usr/include/boost
export BOOST_INCLUDE
BOOST_LIB=/usr/local/lib/boost
export BOOST_LIB
寫一個如下所示的cpp文件。
//samlpe.cpp
#include <iostream>
#include <string>
#include <boost/thread.hpp>
using namespace std;
void threadRoutine(void)
{
boost::xtime time;
time.nsec = 0;
time.sec = 20;
cout << "線程函數做一些事情" << endl;
boost::thread::sleep(time);
}
int main(void)
{
string str;
cout << "輸入任意字元開始創建一個線程..." << endl;
cin >> str;
boost::thread t(&threadRoutine);
t.join();
cout << "輸入任意字元結束運行..." << endl;
cin >> str;
return 0;
}
保存。使用g++編譯,命令如下所示:
g++ -o samlpe.out samlpe.cpp -I$BOOST_INCLUDE -L$BOOST_LIB -lboost_thread-gcc-mt
其中-I參數指定Boost頭文件路徑,-L參數指定Boost庫文件路徑,-l參數指定使用線程庫名。在我使用的這個版本Boost里,到/usr /local/lib/boost路徑下,可以看到有關Boost線程庫文件,比如:libboost_thread-gcc-mt.a等。注意在用-l 參數指定庫名時把磁碟文件名前面那個lib前綴去掉就可以了。
D. windows下boost怎樣安裝與使用說明
一、 下載boost
boost_1_51_0.zip 下載並解壓到C盤根文件夾
二、編譯boost
1、生成生命行程序
執行bootstrap.bat
2、編譯
執行b2.exe,完成後顯示:
The Boost C++ Libraries were successfully built!
The following directory should be added to compiler include paths:
C:/boost_1_51_0
The following directory should be added to linker library paths:
C:\boost_1_51_0\stage\lib
三、使用boost
1、創建一個win32 console
2、引用bootst
C/C++ -> Additional Include Directories: C:\boost_1_51_0
Linker-> Additional Library Directories: C:\boost_1_51_0\stage\lib
Linker->Input->Additional Dependencies :libboost_signals-vc110-mt-gd-1_51.lib;libboost_regex-vc110-mt-gd-1_51.lib;
3、Code如下:
#include "stdafx.h"
#include <boost/regex.hpp>
#include <boost/signals.hpp>
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <cassert>
struct print_sum {
void operator()(int x, int y) const { std::cout << x+y << std::endl; }
};
struct print_proct {
void operator()(int x, int y) const { std::cout << x*y << std::endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
boost::signal2<void, int, int, boost::last_value<void>, std::string> sig;
sig.connect(print_sum());
sig.connect(print_proct());
sig(3, 5);
std::string line;
boost::regex pat( "^Subject: (Re: |Aw: )*(.*)" );
while (std::cin)
{
std::getline(std::cin, line);
boost::smatch matches;
if (boost::regex_match(line, matches, pat))
std::cout << matches[2] << std::endl;
}
return 0;
}
示常式序在vs2012下通過,輸出:
8
15
E. 怎麼在ubuntu上安裝boost1.58
安裝好ubuntu14.04之後,下載boost、qt、osg的庫,進行編譯
1.boost
參考http://www.cnblogs.com/wondering/archive/2009/05/21/boost_setup.html
boost提取出來以後,先./configure,生成b2
這里b2好像就是對應1.40以前的bjam,都是boost自己的編譯程序。
再執行./b2 link=static runtime-link=static variant=debug,release
layout=versioned stage --stagedir="/home/username/boost_1_58_0/bin/gcc"
threading=multi
這個命令是個大概的格式,具體可能有些拼寫符號有誤,主要就多說幾點。一個是link和runtime-link,link是在編譯期間,是選擇
static還是shared,如果是static,那麼boost庫在編譯完成後,會綁入輸出的程序,如果是shared,那麼需要放在代碼目錄下,供
引用。runtime-link則是在程序發布之後,如果啟動運行,調用boost庫的方式,如果選擇shared,那麼不但需要把編譯輸出的文件給客
戶,還要給他一堆依賴的動態鏈接庫。
variant是以什麼方式輸出,如果既想要debug 又想要release,那麼就用逗號連接。
但是,如果同時輸出debug,release,會產生命名沖突,必須指定layout=versioned,這樣debug和release出來的庫的名字才不會沖突。
stage編譯的話,編譯完成後,所有的庫文件都會被輸入指定的stagedir裡面,而include文件本身就在boost_1_58_0下面
的boost文件夾中。不需要再執行make
install,install的作用會把所有生成的庫拷入/usr/local/lib裡面,/boost_1_58_0/boost也會拷入/usr
/local/include 裡面,有點多餘
但是stage方式編譯的話,在每次生成依賴boost庫的程序的時候,需要用-I在指定inlucde路徑。可以通過在環境變數文件裡面指定環境
變數,然後g++編譯的時候,指定這個環境變數。關於環境變數參考了這篇:http://blog.csdn.net/tigerjibo
/article/details/8513365
比如我有一個調用boost庫的代碼文件hboost.c,在/home/username/.profile文件裡面指定了
BOOST_ROOT,重啟生效。編譯的時候 執行 g++ -I$BOOST_ROOT hboost.c -o
hboost,就可以輸出編譯結果,再運行./hboost就可以看到程序運行的結果了。
2.qt
qt其實比較簡單,直接進入解壓到目錄,./congfigure;make;make install三個步驟就可以了。不過由於我要用osg 利用qt的庫編譯osgQT所以這里有個坑。
首先,為什麼選擇QT4.8,這是因為它是QT5.0以下的最新版。為什麼不用QT5呢,因為據osgChina裡面的大牛說,好像QT5在osg
裡面進行多線程方面有bug。具體參考這些帖子,http://bbs.osgchina.org/forum.php?mod=viewthread&
amp;tid=13908&highlight=qt5
http://bbs.osgchina.org/forum.php?mod=viewthread&tid=12703&highlight=qt5
其次,為了最後能生成osgQT,需要編譯QT的GLWidget等相關類,所以需要在本機上安裝opengl。開始的時候參考這篇文章
http://www.wikihow.com/Install-Mesa-(OpenGL)-on-Linux-Mint.但運行命令的時候總是告訴我
依賴有問題。於是看到有人說需要更新源(http://forum.ubuntu.org.cn/viewtopic.php?f=48&
t=468366),就又找到了這篇文章http://wiki.ubuntu.org.cn/%E6%BA%90%E5%88%97%E8%A1
%A8#Trusty.2814.04.29.E7.89.88.E6.9C.AC。這下就全都妥了。
然後進入qt解壓目錄,做./configure -static -debug-and-release -no-sql-sqlite
-no-sql-sqlite2 -no-sql-sqlite_symbian
-opengl生成靜態庫。注意,那幾個no-sql的選項,如果不帶的話,會在下一步make的時候,報
qt_plugin_instance_qsqlite
unresolve之類的錯誤(http://www.qtcentre.org/threads/25304-making-qt-libs-as-
static-problem-under-Linux(ubuntu))。-opengl選項,會讓configure自動去默認路徑尋找opengl
相關的依賴,如果你的opengl安裝的位置不對,他會要求你自己指定其他的位置。
3.osg
osg默認是用cmake來編譯的,所以應該先用apt-get把cmake
cmake-gui搞下來。在編譯的過程中發現,如果本機的依賴庫有問題,有可能會導致編譯或者鏈接失敗。一個比較偷懶的辦法提供給大家。首先,請先更新
你linux的源,之後apt-get build-dep
openscenegraph,這個命令在我這里下載了幾十兆的依賴庫。然後進入到osg的解壓目錄,然後把makefile.txt拖進gui,點擊
configure,勾選group、advanced。如果要編譯Debug那麼先把cmake組裡面的參數build
type(似乎是這個選項)寫Debug,build組裡面的compile
example勾選。然後再點擊一次configure,再點generate。理論上依賴庫應該是沒問題的,因為我們apt-get了那麼多依賴庫對
吧。
然後終端里make,如果報錯,如果報錯是和某個依賴庫有關的,那麼就重新打開cmake-gui,把那個依賴庫選項下的include、library全部刪掉,再重新生成,然後再重新make。如此反復,最終一定會生成一份可用的osg。
當然也可以不下載依賴庫,直接把QT和opengl在默認路徑下准備好,如果這樣的話其實更簡單,直接終端裡面運行./configure就行了,
自動會以release方式cmake出makefile,如果想要Debug方式,那就改一下configure文件。然後make,一般不會有問題。
make結束之後,所有生成的文件會位於解壓文件夾里的bin、lib、inlcude里,把這些拷貝出來,放到另外一個文件夾比如build,然
後把下載到的data文件夾,裡麵包括那個牛、滑翔機和卡車等等經典的模型,也放到這個build裡面,設置一下環境變數,osg應該就可以用了。
設置有關環境變數的問題,需要設置兩個或者三個環境變數。如果在執行完make之後,再執行make
install,那麼只需要設置OSG_FILE_PATH指定data文件夾的位置,並在PATH中指定bin文件夾的位置(這樣可以運行
osgersion,osgiewer這些編譯時附送的應用)。make
install會把include和lib文件夾拷入usr/local下的include、lib文件夾。但是如果沒有執行make
install,那麼需要設置第三個環境變數,那就是LD_LIBRARY_PATH,我的分發版是ubuntu
14.04,sudo gedit /etc/environment打開配置文件,添加export
LD_LIRARY_PATH=$LD_LIBRARYPATH:path to lib然後在終端里執行source
/etc/environment。這樣做是因為在執行osgiewer的時候,如果要讀入cow.osg文件,osg需要lib文件夾下的plugIn
文件夾里的插件來讀取對應格式的文件。由於我我們沒有執行make install所以就需要告訴osg,這個lib文件夾到底在哪裡
http://stackoverflow.com/questions/14012021/osgviewer-cow-does-not-view-a-cow
http://forum.openscenegraph.org/viewtopic.php?t=11021
不得不說,我的osg生成的還是有問題,freetype總是用不了,字體顯示上有些蛋疼。後來很仔細的把cmake裡面的有關freetype的
地址都指定了,也輸出osgdb_freetype.so了,但使用的時候還是出現undefined
symbol錯誤。先不打算搞了,起碼現在主要功能都能用,字體的事先放一放。
http://blog.csdn.net/solofly752/article/details/45481137
F. windows boost 32位怎麼編譯
方法1.運行腳本vsvars32.bat:
D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\vsvars32.bat
這個批處理 主要就是在運行CMD的時候先為我們設置一下環境變數(臨時的) (這個腳本中寫入的是bin, lib,include , tools的路徑信息,也可以自己配置)
方法2.設置系統環境變數:
電腦右鍵屬性-->高級環境變數-->系統環境變數選擇PATH 編輯,將以下內容復制追加:
;D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE;D:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools;D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin;D:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcpackages;C:\Windows\Microsoft.NET\Framework64\v4.0.30319;C:\Windows\Microsoft.NET\Framework64\v3.5;C:\Windows\Microsoft
環境變數生效可能需要重啟計算機。
G. 新人求教 驅動源碼編譯安裝
1、安裝scons
(1) 下載python2.7, 使用x86_32位,因為scons只有32位安裝包可用;
(2) 下載scons2.3.0;
(3) 安裝python 和 scons, 將C:\Python27\Scripts寫入PATH;
(4) 下載安裝pywin32 ,It is recommended you install pywin32 if you want to do parallel builds (scons -j)
2、安裝boost庫(1.49版本).
解壓後雙擊bootstrap.bat,生成bjam.exe後,cd到目錄c:\boost下,(將boost_1_49更名為boost了)編譯boost。
編譯命令:C:\boost>bjam variant=release --with-filesystem --with-thread --with-date_time --with-program_options threading=multi toolset=msvc-10.0 link=static runtime-link=static address-model=32
這是使用VS2010環境編譯的release版本,編譯完成後,生成C:\boost\stage\lib文件夾,下面有6個lib庫:
如果要編譯成debug版本,使用命令:bjam variant=debug --with-filesystem --with-thread --with-date_time --with-program_options threading=multi toolset=msvc-10.0 link=static runtime-link=static address-model=32
編譯完成後,生成C:\boost\stage\lib文件夾,下面有10個lib庫和dll:
此處為MongoDB文檔中對於編譯boost庫的要求原文:
When using bjam, MongoDB expects
variant=debug for debug builds, and variant=release for release builds
threading=multi
link=static runtime-link=static for release builds
address-model=64 for 64 bit(64位的話,把32換為64)。link=static runtime-link=static,boost需要編譯成靜態庫,因為mongodb只會去鏈接boost的靜態庫
address-model=64在win7 64環境下此項必須,不加在編譯mongodb的c++ client時會出現鏈接錯誤。
3、下載mongo2.4.6源碼 http://www.mongodb.org/downloads官網下載
編譯Mongoclient.lib
cmd命令提示符下,cd到解壓後的文件目錄,例如我放在了E盤,E:\mongodb-src-r2.4.6,輸入命令:
scons –-dd --32 mongoclient.lib // build C++ client driver library
Add --64 or --32 to get the 64- and 32-bit versions, respectively. Replace --release with --dd to build a debug build.
編譯後在mongodb\build\win32\32\dd\client_build\生成mongoclient.lib.
4、測試程序
就用Mongodb自帶的例子吧,使用VS2010打開E:\mongodb-src-r2.4.6\src\mongo\client\examples中的simple_client_demo.vcxproj,編譯,會提示生成simple_client_demo.sln,保存。
使用debug模式,配置工程環境:打開工程->屬性,配置Configuration Properties下的VC++ Directories,頭文件路徑添加C:\boost,Lib庫路徑添加boost的lib,以及mongodb client的lib:
C:\boost\stage\lib
E:\mongodb-src-r2.4.6\build\win32\32\dd\client_build
進入C/C++下面的Code Generation,將Runtime Library設置為Multi-threaded Debug (/MTd)
進入Linker下面的Input,設置Additional Dependencies,添加ws2_32.lib,psapi.lib,Dbghelp.lib,mongoclient.lib
將E:\mongodb-src-r2.4.6\build\win32\32\dd\mongo\base下生成的error_codes.h和error_codes.cpp文件,拷貝到E:\mongodb-src-r2.4.6\src\mongo\base目錄下。
ok,編譯、運行.
5、問題解決
error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(dbclient.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(assert_util.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(jsobj.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(status.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
1>mongoclient_d.lib(mutexdebugger.obj) : error LNK2038: mismatch detected for '_MSC_VER': value '1700' doesn't match value '1600' in error_codes.obj
VS的版本不匹配,lib是在更高級的版本中編譯生成的,而使用的時候,是在低級版本中使用的,所以出現了不匹配的錯誤。例如,我在VS2010 SP1和VS2012的環境下編譯的,而使用是在VS2010上使用,所以在編譯時,出現了以上問題。
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymCleanup
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymGetMoleInfo64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymInitialize
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_StackWalk64
1>mongoclient.lib(stacktrace.obj) : error LNK2001: unresolved external symbol __imp_SymFromAddr
在工程依賴庫中添加Dbghelp.lib
其它問題,看看你手頭的編譯器、編譯出來的boost庫版本、mongoclient.lib的版本,是否對應好了。
H. 如何在XCode中配置Boost庫
話說boost在xcode5上的安裝確實很費勁,參考實驗了相當數量的文章後,終於成功在IOS模擬器上跑通了boost庫,廢話少說,上步驟
1. 下載boost.sh安裝腳本,這里選擇的是payco的安裝腳本,https://gist.github.com/payco/6880661 ,最簡單好用。也可以在csdn上我的代碼中下載,https://code.csdn.net/snippets/68017.git
2. 打開終端,su成root,命令為 sudo su,輸入密碼即可
3. 清理掉所有之前安裝的配置,尤其是在用戶目錄下的user-config.jam,必須刪除掉,之前安裝的文件也一並刪除掉,免得影響。(本人就是沒清理之前的配置,導致一直編譯不通過)
4. 把boost.sh 拷貝到/usr/local 下,運行之,會自動下載,解壓,配置,編譯boost。
5. 等待編譯安裝完畢後,顯示 Completed successfully,boost庫即安裝完畢
完成了一半,剩餘的工作就是配置xcode5,其他版本的xcode也是大同小異,沒有什麼區別的。
6. 在xcode下的target-》Building setting-> Linking-> Other Linker Flags中,添加 -lboost_system -lboost_thread,這兩項(常用的功能都包含在這2個庫中,還有其他要使用的功能,都在這里添加庫文件)
7. 在在xcode下的target-》Building setting->Search Path s 中,Header Search Path 添加/usr/local/ios/prefix/include
8. 在在xcode下的target-》Building setting->Search Paths 中,Library Search Path 添加/usr/local/ios/prefix/lib(這是給真機用的,包含arm6,arm7,arm7s等),以及/usr/local/ios/build/i386(這是給模擬器用的),基本都在一個位置上,截取一張圖好了
添加完畢之後,測試一下編譯是否成功。
在任意一個cpp文件內,添加
#include "boost/swap.hpp"
#include "boost/asio.hpp"
編譯無報錯,則順利完成boost庫在xcode5下的IOS使用編譯:)
。