簡體   English   中英

Visual Studio 8和Boost.Python庫奇怪的鏈接

[英]Visual Studio 8 and Boost.Python library strange linking

一般來說,我是Windows中VS 8和C ++的新手。 當我嘗試在兩個不同的項目中編譯VC 8中的Python擴展時,我遇到一個奇怪的問題(一個是非常簡單的虛擬測試項目,另一個是我要添加擴展的相當大的項目)。

我為兩個項目都提供了Boost.Python所需的相同include / library目錄。 它們如下:

包括目錄:

  • C:\\ boost-python \\ boost_1_46_1
  • C:\\ Python27 \\ include

圖書館目錄:

  • C:\\ boost-python \\ boost_1_46_1 \\ stage \\ lib
  • C:\\ Python27 \\庫

虛擬項目可以編譯並正常工作,另一個項目似乎缺少特定的庫。 VS 8給出以下錯誤消息:

Error   3   fatal error LNK1104: cannot open file 'libboost_python-vc80-mt-gdp-1_46_1.lib'  

我構建增強庫時未制作“ libboost_python-vc80-mt-gdp-1_46_1.lib”。

我記得虛擬項目抱怨我不包括'C:\\ boost-python \\ boost_1_46_1 \\ stage \\ lib'時缺少'libboost_python-vc80-mt-gd-1_46_1.lib'。 但是在我提供了該庫目錄之后,它編譯就沒有問題了。 該目錄中確實存在“ libboost_python-vc80-mt-gd-1_46_1.lib”。

所以我很困惑為什么我的其他項目正在尋找gdp而不是像我的虛擬項目那樣尋找gd。 在兩個項目中,代碼的python特定部分相同。

這是我正在測試的偽代碼:

#include <boost/python.hpp>
#include <boost/random.hpp>
#include <boost/random/normal_distribution.hpp>

using namespace boost::python;

boost::mt19937 gen;

struct World
{
    std::string msg;
    double mypi;

    World(std::string msg): msg(msg) {
        gen.seed(std::time(0));
    } // added constructor
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    double get() const { return mypi; }
    void setter(double mypi) { this->mypi = mypi; }

    double getgaussrand() {
        boost::normal_distribution<> nd(0.0, 1.0);
        boost::variate_generator<boost::mt19937&, boost::normal_distribution<> > var_nor(gen, nd);
        return var_nor();
    }

};

BOOST_PYTHON_MODULE(test_vs_proj_dll)
{
    class_<World>("World", init<std::string>())
        .def("greet", &World::greet)
        .def("set", &World::set)
        .def("getgaussrand", &World::getgaussrand)
        .def_readonly("msg",  &World::msg)
        .def_readwrite("mypi", &World::mypi)
        .add_property("rovalue", &World::get)
        .add_property("value", &World::get, &World::setter)
    ;
}

基於它自己選擇的boost庫命名,聽起來像您的大型項目使用STLPort庫而不是編譯器的本機庫使用不同的參數構建,而虛擬項目則沒有。

-gdp
  • g-使用標准和運行時支持庫的調試版本。
  • d-構建代碼的調試版本。
  • p-使用STLPort標准庫,而不是編譯器隨附的默認庫。

Windows Boost入門指南的庫命名”部分提供了更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM