Boost.python的原始碼編譯安裝(嘗試解決Boost.Python.ArgumentError)
問題描述
在本人嘗試用pycaffe執行一個程式(snntoolbox)時,出現了
Boost.Python.ArgumentError: Python argument types in Net.__init__(Net, unicode, int) did not match C++ signature:
的報錯,在翻過各大論壇的相關回答和官方網站的教程之後,主要意見有:1.傳遞引數型別與函式宣告中不一致;2.Boost不應該由sudo apt install
安裝,而應該直接由原始碼根據自身的python進行編譯(build against python version)。
根據本人的情況分析(pycaffe+snntoolbox執行),更有可能是由於第二個原因引起,因此嘗試解決這個問題的話,自然要學習如何通過原始碼編譯安裝。(結果學會了從原始碼安裝boost,但是沒能夠解決報錯,猜想可能是因為:a.解除安裝不乾淨,b.caffe的Makefile裡面的設定問題)
本人對於boost是個門外漢,文章應該有蠻多紕漏的,歡迎指正。
boost簡要介紹
- boost: Boost庫是為C++語言標準庫提供擴充套件的一些C++程式庫的總稱。
- boost.python:它是boost庫的一部分,隨boost一起安裝,用來實現C++和Python程式碼的互動。
libboost-dev的解除安裝
如果你之前已經用sudo apt install libboost-dev libboost-all-dev
的方式安裝了boost(比如你在Ubuntu16.04下按照CUDA官網推薦方式安裝了caffe的話),建議先解除安裝。
解除安裝方式如下:
sudo apt remove libboost-dev libboost-all -dev
Boost.python的編譯安裝
- 說明:因為caffe需要boost的支援,在解除安裝以後所有boost檔案都需要通過安裝(對於非boost.python來說,安裝就是將標頭檔案拷貝到PREFIX路徑[預設為/usr/local]),不只boost.python(boost.python不是headers-only檔案,需要單獨build)
step1:原始碼檔案的下載和解壓
首先,按照boost官網下載指引描述,到所示網站下載boost原始碼的壓縮檔案,當前時間的檔案是boost_1_66_0.tar.bz2
,放在$HOME目錄下。
~$ tar --bzip2 -xvf boost_1_66_0 .tar.bz2
~$ cd boost_1_66_0
~/boost_1_66_0$ ./bootstrap.sh
#返回資訊如下
Building Boost.Build engine with toolset gcc... tools/build/src/engine/bin.linuxx86_64/b2
Detecting Python version... 2.7
Detecting Python root... /usr
Unicode/ICU support for Boost.Regex?... not found.
Backing up existing Boost.Build configuration in project-config.jam.1
Generating Boost.Build configuration in project-config.jam... #配置檔名為project-config.jam
Bootstrapping is done. To build, run:
./b2 #通常的下一步操作
To adjust configuration, edit 'project-config.jam'.
Further information:
- Command line help:
./b2 --help #如果需要更詳細的說明,執行左邊的命令後再根據需要修改自己的命令
- Getting started guide:
http://www.boost.org/more/getting_started/unix-variants.html
- Boost.Build documentation:
http://www.boost.org/build/doc/html/index.html
我們應關注上述返回資訊,包括配置檔名和一些使用提示。
step2:重新編譯boost
這一步是為了保險起見,將所有boost相關檔案都重新編譯,執行一下命令:
~/boost_1_66_0$ ./b2 -a
關注shell返回資訊中,建議將路徑1加入#include path,將路徑2加入#compiler path,以下根據指引設定環境變數。
step3:設定環境變數
~$ sudo gedit ~/.profile
#根據上一步shell中返回的資訊,在開啟的檔案中加入如下兩行資訊
export BOOST_INCLUDE=$HOME/boost_1_66_0
export BOOST_LIB=$HOME/boost_1_66_0/stage/lib
#儲存後關閉檔案
~$source ~/.profile
step4:驗證安裝boost成功
對於我來說,因為caffe是需要boost支援的,驗證方式是在caffe資料夾下重新編譯Makefile.config,依次make all
,make test
,make runtest
直至最後測試完全通過。
當然簡單的方式,應該是呼叫庫,執行一小段程式碼唄。
~$ touch sample.cpp
~$ sudo gedit sample.cpp
向開啟的檔案中填入以下程式碼
#include <string>
#include <iostream>
#include <boost/version.hpp>
#include <boost/timer.hpp>
using namespace std;
int main()
{
boost::timer t;
cout << "max timespan: " << t.elapsed_max() / 3600 << "h" << endl;
cout << "min timespan: " << t.elapsed_min() << "s" << endl;
cout << "now time elapsed: " << t.elapsed() << "s" << endl;
cout << "boost version" << BOOST_VERSION <<endl;
cout << "boost lib version" << BOOST_LIB_VERSION <<endl;
return 0;
}
~$ g++ sample.cpp -o sample.out #編譯生成sample.out檔案
~$ ./sample.out #檢視輸出
得到以下輸出
max timespan: 2.56205e+09h
min timespan: 1e-06s
now time elapsed: 0.000135s
boost version105800#好吧,真的是沒有解除安裝乾淨....
boost lib version1_58