2012-07-27 54 views
16

我一直在嘗試幾個星期才能讓Microsoft Visual Studio 2010爲SWIG創建一個DLL。如果你已經經歷了這個過程,你會如此善意地給出一個深思熟慮的循序漸進的過程解釋嗎?我在網上無處不在,花了好幾個小時試圖做到這一點;但是我發現的所有教程都過時或者說得不好。如何使用Visual Studio 2010與SWIG創建DLL

我用cygwin成功地完成了這個過程;但正如你們中的一些人所知道的,一個cygwin DLL並不是很實用。

因此,我有.i,.cpp和.h文件,我知道可以一起創建一個DLL。我只需要知道如何使用Visual Studio C++ 2010來實現這一點。我所針對的語言是Python。

請不要將我轉介給其他網站;因爲我已經在那裏並嘗試過了。另外,請不要發表任何尖刻的評論,因爲在不久的將來,我很有必要開展這項工作。

非常感謝您的幫助!

回答

46

分步說明。這假定你有源代碼並正在構建一個將源直接鏈接到它的單個DLL擴展。創建工作項目後我沒有回過頭來看,所以我可能錯過了一些東西。如果您遇到困難,請對此帖發表評論。如果您有一個現有的DLL,並且想要創建一個包含它的Python擴展DLL,則此步驟稍有不同。如果你需要關於這篇文章的評論的幫助,我會擴展它。

編輯2012年8月19日:如果與C示例開始,不要在步驟13中使用-c++並使用.c代替.cxx用於在步驟14中的纏繞的文件擴展名和19

  1. 啓動Visual Studio 2010
  2. 文件,新建,來自現有代碼的項目...
  3. 選擇「Visual C++」項目類型並單擊下一步。
  4. 輸入.cpp/.h/.i文件所在的項目文件位置。
  5. 對於項目名稱,請在.i文件中選擇在%module語句中使用的名稱(大小寫很重要)。
  6. 選擇項目類型「動態鏈接庫(DLL)項目」,然後單擊下一步。
  7. 添加到包含搜索路徑Python.h文件的路徑,通常類似於「C:\ Python27 \ include」,然後單擊下一步。
  8. 單擊完成。
  9. 右鍵單擊解決方案資源管理器中的項目,添加,現有項目...,然後選擇您的.i文件。
  10. 右鍵單擊.i文件,屬性,然後選擇配置「所有配置」。
  11. 將項目類型更改爲「自定義生成工具」,然後單擊應用。
  12. 在屬性中選擇「自定義構建工具」(將在上面應用後顯示)。
  13. 輸入「swig -C++ -python -outdir $(Outdir)%(Identity)」命令行(假定SWIG位於您的路徑中,並根據需要將生成的.py文件重定向到Debug或Release目錄)。
  14. 在輸出中輸入「%(Filename)_wrap.cxx; $(Outdir)%(Filename).py」。
  15. 單擊確定。
  16. 右鍵單擊.i文件,然後選擇編譯。
  17. 右鍵單擊項目,添加新過濾器,將其命名爲「生成的文件」。
  18. 用鼠標右鍵單擊「生成的文件」,單擊屬性,並將「SCC文件」設置爲「假」(如果您使用源代碼管理,這可以防止VS2010嘗試檢查此過濾器中生成的文件)。
  19. 右鍵單擊「生成的文件」,添加,退出項目並選擇由編譯生成的_wrap.cxx文件。
  20. 右鍵單擊項目Properties。
  21. 選擇配置「所有配置」。
  22. 選擇配置屬性,鏈接器,常規,附加庫目錄並將路徑添加到Python庫,通常爲「C:\ Python27 \ libs」。
  23. 選擇配置屬性,常規並將TargetName設置爲「_ $(ProjectName)」。
  24. 將目標擴展設置爲「.pyd」。
  25. 構建項目的「發佈」版本。除非您構建一個Python本身的調試版本,否則無法構建Debug版本。
  26. 打開一個控制檯,轉到項目的Release目錄,運行python,導入你的模塊,然後調用一個函數!
+0

謝謝馬克拯救我(可能還有很多其他人)通過反覆試驗找到這個過程的麻煩!我不得不添加到「項目屬性」VC++目錄>>包含目錄「我的C:\ Python27 \ include;但除此之外它像夢一樣工作!順便說一下,我使用的是Microsoft Visual C++ Express;但過程顯然是一樣的。 – user1449530 2012-07-31 19:26:31

+0

@Mark - 偉大的職位,你可以把它擴展到一個有退出DLL的情況嗎? – 2013-07-30 09:36:15

+0

值得注意的是,SWIG不能用於python 64位版本。改爲使用32位版本。 – odedfos 2013-09-29 14:15:15

相關問題