【问题标题】:Visual Studio 8 and Boost.Python library strange linkingVisual Studio 8 和 Boost.Python 库奇怪的链接
【发布时间】:2011-04-06 18:31:31
【问题描述】:

我通常是 Windows 中的 VS 8 和 C++ 的新手。当我尝试在两个不同的项目中编译 VC 8 中的 Python 扩展时遇到了一个奇怪的问题(一个是非常简单的虚拟测试项目,另一个是我想添加扩展的相当大的项目)。

我为这两个项目提供了 Boost.Python 所需的相同包含/库目录。它们如下:

包括目录:

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

图书馆目录:

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

虚拟项目编译和工作没有问题,另一个项目似乎缺少特定的库。 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' 在我构建 boost 库时没有生成。

我记得当我没有包含“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)
    ;
}

【问题讨论】:

  • 如何在 Visual Studio 8 中添加 .lib 文件?我只使用过 VS2005,您在其中输入您正在使用的每个 .lib 文件的名称,因此应该解决此类问题,检查文件名称是否拼写正确。在 VS8 中是如何实现的?
  • 我刚刚添加了库目录。另外,我所说的 VS 8 是指 Visual Studio 8.0,即他的 VS2005。
  • 配置属性 -> 链接器 -> 输入 -> 附加依赖项中有什么? (如这张截图:tenouk.com/ModuleM_files/image002.png

标签: c++ python visual-studio boost


【解决方案1】:

根据它为自己选择的 boost 库命名,听起来您的大型项目使用 STLPort 库而不是编译器的本机库构建了不同的参数,而您的虚拟项目没有。

-gdp
  • g - 使用标准和运行时支持库的调试版本。
  • d - 构建代码的调试版本。
  • p - 使用 STLPort 标准库,而不是编译器提供的默认库。

Library Naming section of the Getting Started on Windows Boost guide 有更多信息。

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    相关资源
    最近更新 更多