5

Cython を使用して、hello.pyx ファイルを exe にコンパイルしようとしています。

最初のステップは、コマンド「cython --cplus --embed hello.pyx」を使用して、hello.pyx を hello.cpp ファイルにコンパイルすることでした。Embedオプションはすることを意味しGenerate a main() function that embeds the Python interpreterます。依存関係のない独立したexeを作成しようとしています。

hello.cppがある#include "Python.h"ので、ここから Python ソースをダウンロードしています: http://www.python.org/download/releases/2.6.6/Gzipped source tar ball (2.6.6)を選択します。include dir を追加すると、Python26.lib が見つからないというエラーが表示されます。だから私はそれをコンパイルしようとしています。デフォルトのビルドでは python26.lib が作成されますが、200 KB しかありません。これは静的ライブラリではありません。hello.cpp をコンパイルしようとすると、参照が見つからないというエラーが発生します。

README には、静的にビルドする方法に関する有用な指示はありません。ただし、オンラインの README ファイルをグーグルで検索しました。トランク内の最新バージョンの python (3.x) については、静的ビルドに関する有用な情報がいくつかあります。

http://svn.python.org/projects/python/trunk/PCbuild/readme.txt

ソリューションには、静的ライブラリの構成がありません。ただし、DLL の代わりにスタティック ライブラリをビルドするのは簡単です。「構成タイプ」を「静的ライブラリ (.lib)」に設定し、プリプロセッサ マクロ「Py_ENABLE_SHARED」を「Py_NO_ENABLE_SHARED」に変更するだけです。また、「ランタイム ライブラリ」を「マルチスレッド DLL (/MD)」から「マルチスレッド (/MT)」に変更する必要がある場合もあります。

しかし、まだ詳細はあまりありません。ソリューション内のすべてのプロジェクトを静的ライブラリとしてビルドするように設定する必要がありますか? それともpythoncoreのみ?「Python」および「Pythonw」プロジェクトは「アプリケーション」であるため、ランタイム ライブラリを /MT にのみ変更できます。これらは私がやっている手順です:

  • 「リリース」モードに変更します。
  • Project "Python" -/MTプリプロセッサ定義の設定と追加Py_NO_ENABLE_SHARED
  • Project "Pythoncore" -プリプロセッサ定義をStatic library (.lib)/MT に置き換える構成タイプPy_ENABLE_SHAREDPy_NO_ENABLE_SHARED
  • プロジェクト「Pythonw」 - 「Python」と同じ。
  • 「Python」でビルドを右クリックします。

ビルドの概要:

ビルド: 5 成功、1 失敗、0 最新、0 スキップ

kill_python (ok)
make_buildinfo (ok)
make_versioninfo (ok)
pythoncore (ok)
w9xpopen (ok)
python (4 errors)

失敗したプロジェクトは「Python」です。ログは次のとおりです。

------ Build started: Project: python, Configuration: Release Win32 ------
Compiling...
python.c
Compiling resources...
Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385
Copyright (C) Microsoft Corporation.  All rights reserved.
Linking...
pythoncore.lib(sysmodule.obj) : error LNK2019: unresolved external symbol __Py_svnversion referenced in function _svnversion_init
pythoncore.lib(getversion.obj) : error LNK2019: unresolved external symbol _Py_GetBuildInfo referenced in function _Py_GetVersion
pythoncore.lib(dynload_win.obj) : error LNK2019: unresolved external symbol __Py_DeactivateActCtx referenced in function __PyImport_GetDynLoadFunc
pythoncore.lib(dynload_win.obj) : error LNK2019: unresolved external symbol __Py_ActivateActCtx referenced in function __PyImport_GetDynLoadFunc
d:\python\src4\PCbuild\\python.exe : fatal error LNK1120: 4 unresolved externals
Build Time 0:02

/PCbuild/ ディレクトリを見てみると、「pythoncore.lib」(10MB) は存在しますが、「python26.lib」はありません。

これらのエラーをグーグルで検索すると、mail.pythong.org で 1 つの会話しか見つかりません: http://www.groupsrv.com/computers/about397568.html

pythoncore プロジェクトで先行定義 "_USRDLL" を削除しようとしましたが、それでもエラーは同じです。

pythoncore のプリプロセッサ定義は次のとおりです。

_USRDLL
Py_BUILD_CORE
Py_NO_ENABLE_SHARED
WIN32

編集をクリックすると、別のボックスに「継承された値」が表示されます。

NDEBUG
_WIN32

モードをReleaseに変更したため、そのNdebugは奇妙です。

すべてのサービス パックがインストールされた Visual Studio 2008 (Express ではない) を使用しています。

ところで。以前にソリューション全体を構築しようとしましたが、パスが「../../dba-」で始まるファイルが見つからないというエラーがいくつかありました。


Python の 2.6.2 および 2.6.6 バージョンをコンパイルしようとしましたが、どちらも同じエラーをスローします。pythoncore.lib(sysmodule.obj) : error LNK2019: unresolved external symbol

4

1 に答える 1

2

私は 2.4 から 2.7 までの Python 静的を構築してきましたが、セットアップには少し手間がかかります。

ソリューション内のすべての有効なプロジェクトの構成を更新して、それらを /MT に設定する必要があります。Python を静的にビルドするには、SQLite や OpenSSL などのライブラリを含め、Python が参照するすべてのものも静的である必要があります。これは、実際には含まれていない .pyd モジュールにも当てはまります。そうしないと、後でインポートできなくなるからです。

また、Modules/socketmodule.h の上部付近で次の編集を行う必要がある場合があります。

#else /* MS_WINDOWS */
# define inet_pton _msvc_inet_pton
# define inet_ntop _msvc_inet_ntop
# include <winsock2.h>
# include <ws2tcpip.h>
# include <wspiapi.h>
# undef inet_pton
# undef inet_ntop

すぐにエラーが発生した場合は、他に次のことが必要になる可能性があります。

  • 埋め込みマニフェストの作成を無効にします。distutils msvc9compiler.py の ~650 行を参照してください。/MT でビルドしてもこれらが作成されるのはバグです。

  • distutils msvccompiler/msvc9compiler.py で /MD を /MT に変更します。そうしないと、サードパーティのライブラリが正しくビルドされません。

于 2012-09-08T14:20:27.130 に答える