qmakeをcmakeのようにpythonを自動的に検索します
ここではqmakeについて説明しますが、pythonを埋め込んだC++プログラムをcmakeでコンパイルします.
例
簡単に、C、C++にpythonを埋め込む例
この例はpython解釈器を埋め込み、pythonのprint文を実行します.プログラムの実行結果:
コンパイル方法コンパイル自体は簡単です. というコマンドしか必要ありません.
残念なことに、pythonのインストールパスを指定する必要がありますが、インストールパスやPythonバージョンが異なるため、スクリプトなどに直接書くことはできません.
cmake
cmakeを使うなら、このようなエンジニアリングファイルしか必要ありません. CMakeLists.txt
次に実行
はい、pythonのパスを最初から最後まで指定する必要はありません.いいわね
しかし、私はcmakeではなくqmakeを使っています.これはどうすればいいですか.
qmake Linux下: qmakeはpkg_を提供するためconfigサポート、linuxの下で、私たちは簡単に次のxxxを書きます.Proファイル. Windowsでは、こんなにラッキーではありません.pkg_configには市場がありません.本当にそう書きますか
悔しい!
WindowsでPythonを見つけるには
私たちが始めた例を考えてみてください.このプログラムが実行されたとき、Pythonのモジュールをどうやって見つけたのでしょうか. PYTHONHOMEが設定されている場合は が使用する.それ以外の場合、実行可能プログラムが存在するディレクトリに従って上へ検索(lib/os.py) それ以外の場合、レジストリ を検索します.
はい、私たちに役立つ1、3の2つですが、Windowsでは環境変数もあまり使いませんね.レジストリを調べるしかない
レジストリを読み込みますか?
qmakeマニュアルをめくってみると、qmakeがレジストリを操作する機能を提供していることは見つからなかった.qmakeソースを見て、うん、まだ...
どうすれば、他のプログラムを使うか、Windowsのデフォルトサポートを書くしかないようです.bat/.vbs/.jsスクリプト?
大丈夫regがあるexeのプログラムは使用できます.コマンドラインの下で実行してみてください.
ええ、このコマンドを実行して結果のREGを抽出すればいいようです.SZの後ろの経路でいいです.
でもやっぱり憎らしい2.7があるの?他の人はPython 2を使っているかもしれません.6か2.5、ええ、全部調べました.
最終コードは次のとおりです.可能なバージョン番号をリストPY_に格納VERSIONS このリストを巡りregをチェックする.exeの戻り値、0でない場合 をスキップ regを取得する.exeの標準出力、正規表現で経路をPY_に抽出HOME中 判断Python.hが存在するか、存在しないかは をスキップする.ヘッダファイルパスとライブラリファイルをそれぞれINCLUDEPATHとLIBSに追加 注意、ライブラリファイルはPythonXXに分けられます.libとPythonXX_d.lib
終了 恩、このコードをXXXに追加します.Proファイルでいいです. 見ていて気分が悪くなったら、単独で1つのXXXを置くことができます.priファイル内、includeが入ります. 不快であれば、mypythonを単独で置くことができます.prfのファイルの中で、それから.Proファイル内でCONFIG+=mypython を使用
例
簡単に、C、C++にpythonを埋め込む例
#include "Python.h"
int main()
{
Py_Initialize();
PyRun_SimpleString("print \'Hello qmake!\'");
Py_Finalize();
return 0;
}
この例はpython解釈器を埋め込み、pythonのprint文を実行します.プログラムの実行結果:
"Hello qmake!"
コンパイル方法
g++ main.cpp -ID:\Python27\include D:\Python27\libs\python27.lib
残念なことに、pythonのインストールパスを指定する必要がありますが、インストールパスやPythonバージョンが異なるため、スクリプトなどに直接書くことはできません.
cmake
cmakeを使うなら、このようなエンジニアリングファイルしか必要ありません.
cmake_minimum_required(VERSION 2.8)
project(HELLO)
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
add_executable(hello main.cpp)
次に実行
cmake .
make
はい、pythonのパスを最初から最後まで指定する必要はありません.いいわね
しかし、私はcmakeではなくqmakeを使っています.これはどうすればいいですか.
qmake
CONFIG -= qt
CONFIG += console
unix{
CONFIG += link_pkgconfig
PKGCONFIG += python
}
SOURCES += main.cpp
win32{
INCLUDEPATH += D:\\Python27\\include
LIBS += D:\\Python27\\libs\python27.lib
}
悔しい!
WindowsでPythonを見つけるには
私たちが始めた例を考えてみてください.このプログラムが実行されたとき、Pythonのモジュールをどうやって見つけたのでしょうか.
はい、私たちに役立つ1、3の2つですが、Windowsでは環境変数もあまり使いませんね.レジストリを調べるしかない
レジストリを読み込みますか?
qmakeマニュアルをめくってみると、qmakeがレジストリを操作する機能を提供していることは見つからなかった.qmakeソースを見て、うん、まだ...
どうすれば、他のプログラムを使うか、Windowsのデフォルトサポートを書くしかないようです.bat/.vbs/.jsスクリプト?
大丈夫regがあるexeのプログラムは使用できます.コマンドラインの下で実行してみてください.
C:\> reg query HKLM\SOFTWARE\Python\PythonCore\2.7\InstallPath /ve
HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\InstallPath
( ) REG_SZ D:\Python27\
ええ、このコマンドを実行して結果のREGを抽出すればいいようです.SZの後ろの経路でいいです.
でもやっぱり憎らしい2.7があるの?他の人はPython 2を使っているかもしれません.6か2.5、ええ、全部調べました.
最終コードは次のとおりです.
win32:{
PY_VERSIONS = 2.7 2.6 2.5 2.4
for(PY_VERSION, PY_VERSIONS){
system(reg query HKLM\\SOFTWARE\\Python\\PythonCore\\$$PY_VERSION\\InstallPath /ve) {
PY_HOME = $$quote($$system(reg query HKLM\\SOFTWARE\\Python\\PythonCore\\$$PY_VERSION\\InstallPath /ve))
PY_HOME ~= s/.*(\\w:.*)/\\1
!exists($$PY_HOME\\include\\Python.h):next()
INCLUDEPATH *= $$PY_HOME\\include
PY_LIB_BASENAME = python$${PY_VERSION}
PY_LIB_BASENAME ~= s/\\./
CONFIG(debug, debug|release):PY_LIB_BASENAME = $${PY_LIB_BASENAME}_d
LIBS *= $$PY_HOME\\libs\\$${PY_LIB_BASENAME}.lib
message(Python$$PY_VERSION found at $$PY_HOME)
break()
}
}
}