【发布时间】: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