1. 程式人生 > >Boost.python的原始碼編譯安裝(嘗試解決Boost.Python.ArgumentError)

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

參考資料