自發行python版本製作(二)編譯

来源:http://www.cnblogs.com/np10/archive/2016/02/09/5185477.html
-Advertisement-
Play Games

本系列文章第二篇主要說明windows環境的編譯環境搭建以及編譯過程。 編譯環境選擇: 1.選用作神一樣存在的Microsoft Visual C++ Compiler for Python 2.7為編譯器使用。不選用vs的原因在於vs過於龐大不太適合我這種喜歡小而全的思想。這裡也沒有選擇Annou


本系列文章第二篇主要說明windows環境的編譯環境搭建以及編譯過程。

 

編譯環境選擇:

1.選用作神一樣存在的Microsoft Visual C++ Compiler for Python 2.7為編譯器使用。不選用vs的原因在於vs過於龐大不太適合我這種喜歡小而全的思想。這裡也沒有選擇Announcing Visual C++ Build Tools 2015作為編譯環境因為這個東東沒有離線安裝包,在很多地方沒有離線安裝方式就可以說根本無法使用。

2.使用vcbuild方式進行編譯。這裡沒有選擇msbuild進行編譯是因為神一樣存在的Microsoft Visual C++ Compiler for Python 2.7是vs2008的精簡版,在2008中還沒有講vcbuild換成msbuild方式。這兩種方式都是比較不錯的方式,只不過上面沒有選用vs2015的精簡版(Announcing Visual C++ Build Tools 2015)所以無法選用msbuil而已。

3.選用命令行方式進行編譯,也算是一個挑戰。因為在大家的概念中在windows上編譯的東東都必須使用vs的界面進行,網路上這方面的資料也比較少。所以,這裡當作一個挑戰進行。不過在使用命令行編譯的過程中發現vs的整套編譯環境比較全面而且靈活性很高,這裡給vs命令行編譯過程點個贊。

 

環境搭建:

0.操作系統為win10 64位系統,python源碼版本選用當前最新版本2.7.11。

1.下載並安裝神一樣存在的Microsoft Visual C++ Compiler for Python 2.7,添加INCLUDE和LIBPATH到環境變數中。

2.下載並安裝Microsoft Visual C++ 2008 Redistributable Package (x64)Microsoft Visual C++ 2008 Redistributable Package (x86)

3.下載並安裝ActivePerl,並檢查環境變數是否生效。

4.下載並安裝NASM

5.下載SQLite 3.6.21,並將sqlite源代碼解壓到python源代碼目錄下的externals目錄下。

6.下載bzip2-1.0.6.tar.gz。並將bz源代碼解壓到python源代碼目錄下的externals目錄下。

7.下載openssl-1.0.2d.tar.gz。並將openssl源代碼解壓到python源代碼目錄下的externals目錄下。

其上,每一個東東意義分別為:1,2為基礎編譯環境。3,4為openssl在windows上編譯所必須的。5,6,7為python的相關開源項目。

 

編譯過程:

0.先開始,可以從pcbuild目錄下找到readme.txt從中可以看到

1 Quick Start Guide
2 -----------------
3 
4 1.  Install Microsoft Visual Studio 2008, any edition.
5 2.  Install Microsoft Visual Studio 2010, any edition, or Windows SDK 7.1
6     and any version of Microsoft Visual Studio newer than 2010.
7 3.  Install Subversion, and make sure 'svn.exe' is on your PATH.
8 4.  Run "build.bat -e" to build Python in 32-bit Release configuration.
9 5.  (Optional, but recommended) Run the test suite with "rt.bat -q".

可以看到最新的python源代碼支持vs2010進行編譯。另外還能看到:

Legacy support
--------------

You can find build directories for older versions of Visual Studio and
Visual C++ in the PC directory.  The project files in PC/VS9.0/ are
specific to Visual Studio 2008, and will be fully supported for the life
of Python 2.7.

The following legacy build directories are no longer maintained and may
not work out of the box.

PC/VC6/
    Visual C++ 6.0
PC/VS7.1/
    Visual Studio 2003 (7.1)
PC/VS8.0/
    Visual Studio 2005 (8.0)

這裡可以看到vs2008是一個現在還支持,但是在pc/vs9.0目錄下。

2.到pc/readme.txt中可以得到編譯過程基本是從build.bat開始的。所以到pc/vs9.0下直接查找build.bat。打開build.bat可以看到這是一個比較簡單的腳本,按照參數進行填寫參數,調用build.bat基本就可以了。

3.代碼Visual C++ 2008 64-bit Command Prompt,切換到python代碼目錄的pc/vs9.0下。執行

build.bat -c Release -p x64 -t Rebuild

直接報錯,提示找不到cl命令,和目標是64位,編譯出來是32位。解決辦法:

build.bat -c Release -p x64 -t Rebuild /useenv /logcommands /platform:x64

添加了後面的三個參數,這三個參數是vcbuid的參數,參數意義詳見:VCBUILD 選項

最終build.bat腳本解釋出:

vcbuild "D:\\Python-2.7.11\PC\VS9.0\pcbuild.sln" /rebuild "Release|x64" /useenv /logcommands /platform:x64

4.刪除我們不需要的子項目:

從pcbuild.sln中可以可以看到有_ctypes,_ctypes_test,_elementtree,_hashlib,_msi,_multiprocessing,_socket,_testcapi,pyexpat,select,unicodedata,winsound,_bsddb,_bz2,_ssl,_sqlite3,_tkinter,w9xpopen

在上篇文章中說到需求不使用tk講tk刪除。bsddb比較古老的db標準,現在估計沒人使用也刪了。_ssl,_hashlib都是用openssl,在windows編譯openssl比較麻煩暫時刪除,之後搞定openssl的windows編譯之後再添加進來。w9xpopen是win9X的環境支持,也刪掉。

5.使用上面的編譯命令進行編譯:

發現仍有編譯不過問題,提示編譯dll時找不到入口函數。調查後發現鏈接dll時缺少參數/dll,詳情參見:Linker Options

根據這個調查發現vcproj中的Configuration中配置的ConfigurationTypes Enumeration正確。但是依然不添加/dll參數,查找VCLinkerTool的標簽屬性發現缺少LinkDLL參數,添加後編譯常常。

6.編譯結果:

編譯出python.exe,pythonw.exe,python27.dll等等,雙擊python.exe:

Python 2.7.11 (default, Feb  9 2016, 10:51:22) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.>>> import os
>>> print os
<module 'os' from 'D:\\Python-2.7.11\lib\os.pyc'>
>>>

可以執行。下一篇文章會詳細介紹編譯目錄下編譯出的文件的意義,以及進一步的添加win api相關。

 

參考文獻:

https://docs.python.org/2/using/windows.html

 

Building C++ Projects in Visual Studio

https://msdn.microsoft.com/en-us/library/7s88b19e(v=vs.90).aspx


C/C++ Building Reference

https://msdn.microsoft.com/en-us/library/91621w01.aspx


Solutions and Projects in Visual Studio

https://msdn.microsoft.com/en-us/library/b142f8e7.aspx


Solution (.Sln) File

https://msdn.microsoft.com/en-us/library/bb165951(v=VS.90).aspx


Extending Solution Explorer

https://msdn.microsoft.com/en-us/library/bb166499(v=vs.90).aspx

 

Property Inheritance

https://msdn.microsoft.com/en-us/library/tybz7dex(v=vs.90).aspx

 

Project Files

https://msdn.microsoft.com/en-us/library/2208a1f2(v=vs.90).aspx


關於VCPROJ文件的說明

http://blog.sina.com.cn/s/blog_6288219501011nib.html

 

VCProject Properties

https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vcprojectengine.vcproject_properties(v=vs.90).aspx


Visual C++ Project Model

https://msdn.microsoft.com/en-us/library/2eydyk57(v=vs.90).aspx


Visual C++ Code Model

https://msdn.microsoft.com/en-us/library/t41260xs(v=vs.90).aspx


Microsoft.VisualStudio.VCProjectEngine Namespace

https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vcprojectengine(v=vs.90).aspx


ConfigurationTypes Enumeration

https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vcprojectengine.configurationtypes(v=vs.90).aspx


VCLinkerTool Members

https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.vcprojectengine.vclinkertool_members(v=vs.90).aspx

 

VCBUILD 選項

https://msdn.microsoft.com/zh-cn/library/cz553aa1(VS.80).aspx


Linker Options

https://msdn.microsoft.com/en-us/library/y0zzbyt4(v=vs.90).aspx

 

RegOpenKey function

https://msdn.microsoft.com/en-us/library/windows/desktop/ms724895(v=vs.85).aspx


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 分類:C#、Android、VS2015; 創建日期:2016-02-07 一、簡介 1、CheckBox 覆選 【Checked】屬性:是否選中。 2、RadioButton 單選 【Checked】屬性:是否選中。 【RadioGroup】屬性:RadioButton的分組容器。註意必須將Rad
  • 分類:C#、Android、VS2015; 創建日期:2016-02-07 一、簡介 1、Button 常規按鈕。 2、TextView 文本視圖,其功能和WPF的TextBlock控制項類似,【工具箱】中提供的3個組件實際上是同一個TextView控制項用不同的屬性來區分的,這3個不同的屬性在【工具箱
  • 分類:C#、Android、VS2015; 創建日期:2016-02-06 這一章主要介紹Android簡單控制項的基本用法。本章源程式共有9個示例,這些示例都在同一個項目中。 項目名:ch05demos,項目模板:Blank App(Android) 運行主界面截圖如下: 點擊每行的示例項,即進入對
  • 分類:C#、Android、VS2015;創建日期:2016-02-06 開發人員可以用以下兩種方式聲明UI:一是通過.xml文件(不帶預覽界面)或者.axml文件(帶預覽界面)來描述;二是用C#代碼實現。 用.axml文件描述用戶界面(UI)時,設計器分為【設計】視圖和【源】視圖。這種方式的優點是
  • 問題背景:八皇後問題是一個以國際象棋為背景的問題:如何能夠在 8×8 的國際象棋棋盤上放置八個皇後,使得任何一個皇後都無法直接吃掉其他的皇後。為了達到這個目的, 任兩個皇後都不能處於同一條橫行、縱行或斜線上。 以下的代碼給出的解法應該是最容易理解的一種方法,本問題還可以用回溯法和遞歸解決,理論上效率
  • PID控制器的數字實現及C語法講解 概述 為方便學習與交流,根據自己的理解與經驗寫了這份教程,有錯誤之處請各位讀者予以指出,具體包含以下三部分內容: (1) PID數字化的推導過程(實質:微積分的近似計算); (2) 程式風格介紹(程式風格來源於TI官方案例); (3) C有關語法簡述(語法會結合實
  • 1 /*Joseph Problem 2 *利用單迴圈鏈表解決約瑟夫問題。 3 *問題描述:將n個數鏈接成一個環,從第m個開始,每次從1計數到s時 4 * 將s刪除。從下一個開始再次從1計數至s時刪除s。直到全 5 * 部刪除為止。 6 * */ 7 #include<stdio.h> 8 #inc
  • +=,-=,*=,/=隱含了強制類型轉換。 邏輯運算中,&和&&的區別為: &:無論左邊為真假,右邊都參與運算 &&:如果左邊為假,則右邊不參與運算,如果左邊為真,右邊參與運算。 異或操作可以實現兩個整數的交換(不需要額外空間開銷): a, b; a = a ^ b; b = a ^ b; a =
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...