2010-11-07 76 views
1

我有一个VS10项目。我想构建一些C++代码,以便我可以在Python中使用它。我遵循boost教程并使其工作。然而,VS保持连接boost-python-vc100-mt-gd-1_44.lib,但它只是一个调用boost-python-vc100-mt-gd-1_44.dll的包装器。这就是为什么我需要将.dll与我的.dll(.pyd)文件复制。所以我想将boost:python静态链接到该.dll(.pyd)文件。但我在VS或编译器和链接器手册中找不到任何配置选项。最奇怪的是,我有一个使用boost :: filesystem的旧项目,它具有相同的配置,但项目链接是针对libboost-filesystem - *。lib,它是静态lib,所以没关系。我一直在Google上搜索几个小时而没有取得任何成功,这让我疯狂。MSVC - boost :: python静态链接到.dll(.pyd)

感谢您的任何帮助或建议。

回答

0

链接的库取决于项目的设置。有两种可能性:你可以建立针对

  1. 静态
  2. 动态

的C运行时库的链接的版本。根据选择哪个选项,升压会向链接器发送正确的#pragma。这些选项需要在构成您的程序的所有项目中一致地设置。所以去“属性 - > C++ - >代码生成”(或类似的,我只是猜测,没有VS并立即运行),并确保正确的选项设置(一致)。当然,您必须在编译之前以所需的格式编译boost库...

+0

Boost被设置为:link = static link = shared threading = single threading = multi variant = debug variant = release runtime-link = static runtime-link = shared因此一切都应该在那里。在VS中,如果我设置了C++> CodeGeneration> Runtime =“static”,我得到一个错误“致命错误C1189:#error:”使用静态运行时混合dll boost库是一个非常糟糕的主意......“ – kangcz 2010-11-08 09:56:03

+0

嗯,由于某种原因,boost仍然假设你想链接到它的dll,你是否真的在安装目录中有所有版本的boost库?你可以从命名方案中看到它。我不确定你上面写出的选项是否是你需要为所有项目和跑步者设置'C++> CodeGeneration> Runtime =“static”',然后,boost配置系统应该选择'--build-type =或者你可以用#define选择所需的连接,检查boost手册 – 2010-11-08 15:50:52

+0

嗨,我真的不知道#pragma的用途是什么,我搜索了头文件并找到/ boost/python/details/config.hpp来调用#pragma来请求.dll。我试着对它进行评论并请求我的静态.lib,但它没有工作。然后我看到在这个头文件中检查“#define BOOST_PYTHON_STATIC_LIB”,并在我的源文件中定义它。不,它链接好。 (但是这个定义被评论为已弃用)。 谢谢你的帮助。 – kangcz 2010-11-08 20:28:07

1

您可能不想这样做。静态链接Boost python有一些问题和怪癖,当有多于一个基于boost的基于python的库导入时。 “但我只有一个”你说。你能保证你的用户不会有另一个?你可能想在未来使用另一个?坚持与DLL。分发另一个DLL真的不是什么大不了的事情。把它并排放在同一个目录下。

+0

有趣的一点。只是为了好奇,你的意思是什么样的问题和怪癖? – kangcz 2010-11-10 20:36:47

+2

基本上,该进程有2个BP类型表副本。旨在共同工作的Lib不能因为他们看不到其他的RTTI。更多的内存用于代码和数据等。细节取决于操作系统和其他一切。 – 2010-11-16 16:13:18