2010-11-07 78 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