本來想用mingw編譯boost::python模塊,網上看了下資料太少,只有使用vs2012
操作環境:win7 x64
python: x86
boost: 1.57
-
編譯boost::python模塊
1: 開始->Microsoft Visual Studio 2012->Visual Studio Tools->VS2012開發人員命令提示 ; 因為我python是32位的,所以使用這個命令窗口
2:bootstrap.bat 編譯出b2.exe
3: b2.exe --with-python --build-type=complete ; 沒搞明白link runtime-runk的區別所以直接這么搞
編譯結果如下:
-
創建vs工程(控制台工程)
配置工程屬性。
工程默認使用動態庫的 boost_python-vc110-mt-gd-1_55.lib,可以設置編譯宏BOOST_PYTHON_STATIC_LIB 使用靜態庫:libboost_python-vc110-mt-gd-1_55.lib
該工程可以不用設置靜態庫的名字,估計是頭文件里面設置了的
源文件
#include<iostream> #include<boost/python.hpp> #include<Python.h> using namespace boost::python; int main() { Py_Initialize(); // 檢查初始化是否成功 if ( !Py_IsInitialized() ) { return -1; } PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); object mainModule; object mainNamespace; try { mainModule = import("__main__"); mainNamespace = mainModule.attr("__dict__"); exec("import os", mainNamespace, mainNamespace); exec("print os.getcwd()", mainNamespace, mainNamespace); } catch( ... ) { if (PyErr_Occurred()) PyErr_Print(); } // 關閉Python Py_Finalize(); system("pause"); }
最重要的地方來了
#include<boost/python.hpp>
#include<Python.h>
兩個頭文件的位置一定是這樣的。發現在很多c++項目中,頭文件的位置不對經常引起各種問題 。該問題輸出為;
1>------ 已啟動生成: 項目: python, 配置: Debug Win32 ------ 1> main.cpp 1>main.obj : error LNK2019: 無法解析的外部符號 __imp___Py_NegativeRefcount,該符號在函數 "public: __thiscall boost::python::api::object_base::~object_base(void)" (??1object_base@api@python@boost@@QAE@XZ) 中被引用 1>main.obj : error LNK2019: 無法解析的外部符號 __imp___Py_Dealloc,該符號在函數 "public: __thiscall boost::python::api::object_base::~object_base(void)" (??1object_base@api@python@boost@@QAE@XZ) 中被引用 1>main.obj : error LNK2001: 無法解析的外部符號 __imp___Py_RefTotal 1>E:\visual studio 2012\Projects\python\Debug\python.exe : fatal error LNK1120: 3 個無法解析的外部命令 ========== 生成: 成功 0 個,失敗 1 個,最新 0 個,跳過 0 個 ==========
還好我手賤 移動了下位置
最后檢測了下 Python.h頭文件不需要加,但是不知道是不是我這個源文件不需要