qmakeをcmakeのようにpythonを自動的に検索します


ここではqmakeについて説明しますが、pythonを埋め込んだC++プログラムをcmakeでコンパイルします.

簡単に、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を使うなら、このようなエンジニアリングファイルしか必要ありません.
  • CMakeLists.txt
  • 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
  • Linux下:
  • qmakeはpkg_を提供するためconfigサポート、linuxの下で、私たちは簡単に次のxxxを書きます.Proファイル.
    CONFIG  -= qt
    CONFIG  += console
    unix{
        CONFIG += link_pkgconfig
        PKGCONFIG += python
    }
    
    SOURCES += main.cpp
  • Windowsでは、こんなにラッキーではありません.pkg_configには市場がありません.本当にそう書きますか
  • win32{
        INCLUDEPATH += D:\\Python27\\include
        LIBS += D:\\Python27\\libs\python27.lib
    }

    悔しい!
    WindowsでPythonを見つけるには
    私たちが始めた例を考えてみてください.このプログラムが実行されたとき、Pythonのモジュールをどうやって見つけたのでしょうか.
  • PYTHONHOMEが設定されている場合は
  • が使用する.
  • それ以外の場合、実行可能プログラムが存在するディレクトリに従って上へ検索(lib/os.py)
  • それ以外の場合、レジストリ
  • を検索します.
    はい、私たちに役立つ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、ええ、全部調べました.
    最終コードは次のとおりです.
  • 可能なバージョン番号をリストPY_に格納VERSIONS
  • このリストを巡りregをチェックする.exeの戻り値、0でない場合
  • をスキップ
  • regを取得する.exeの標準出力、正規表現で経路をPY_に抽出HOME中
  • 判断Python.hが存在するか、存在しないかは
  • をスキップする.
  • ヘッダファイルパスとライブラリファイルをそれぞれINCLUDEPATHとLIBSに追加
  • 注意、ライブラリファイルはPythonXXに分けられます.libとPythonXX_d.lib

  • 終了
  • 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()
           }
       }
    }
  • 恩、このコードをXXXに追加します.Proファイルでいいです.
  • 見ていて気分が悪くなったら、単独で1つのXXXを置くことができます.priファイル内、includeが入ります.
  • 不快であれば、mypythonを単独で置くことができます.prfのファイルの中で、それから.Proファイル内でCONFIG+=mypython
  • を使用