1. 程式人生 > 其它 >boost::python開發環境搭建

boost::python開發環境搭建

本來想用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標頭檔案不需要加,但是不知道是不是我這個原始檔不需要