先に結論
cmakeの3.12前と3.12以降でFinePythonの設定を切り替えるようにしました。
if( ${CMAKE_VERSION} LESS 3.12 )
find_package(PythonLibs REQUIRED)
include_directories(${PYTHON_INCLUDE_DIRS})
else()
find_package(Python COMPONENTS Interpreter Development)
include_directories(${Python_INCLUDE_DIRS})
endif()
もっとスマートなコードがあればコメントまでお願いします!
'Python.h' file not found
cmakeを使ってPythonのライブラリをインクルードしているC++のコードをmakeすると、こんなエラーが出てしまいました。
fatal error: 'Python.h' file not found
#include "Python.h"
PythonLibsは3.12から非推奨
では最初に以下のように書いてあります。
Deprecated since version 3.12: Use FindPython3, FindPython2 or FindPython instead.
cmake_minimum_required
を 3.12
にして、FindPythonLibs
→FindPython3
に変更すれば解決になりそうではありますが、そこまで上げられない場合には両方サポートしてあげたほうが良さそうです。(Python2はもういいとは思いますが)
パラメータの闇
find_package
さえ変更すれば、問題ないかと思っていたのが大きな問題で、include_directories
にも影響があることが判明。
(これを見つけるのに時間がかかってしまった)
これを見ても、最初何が違うのかわからなかったです。(なぜ大文字小文字で区別するのか...)
FindPythonLibs | FindPython | |
---|---|---|
Python.h の検索パス | PYTHON_INCLUDE_DIRS | Python_INCLUDE_DIRS |
Python ライブラリのパス | PYTHON_LIBRARIES | Python_LIBRARIES |
こんなデバッグを入れておきました
cmakeのmassageコマンドでこれらのパラメータを出力しておくとエラーの時に参考になりそうです。
message(STATUS "CMAKE_VERSION:${CMAKE_VERSION}" )
message(STATUS "include_directories(PYTHON_INCLUDE_DIRS):${PYTHON_INCLUDE_DIRS}" )
message(STATUS "include_directories(Python_INCLUDE_DIRS):${Python_INCLUDE_DIRS}" )
message(STATUS "include_directories(PYTHON_LIBRARIES):${PYTHON_LIBRARIES}" )
message(STATUS "include_directories(Python_LIBRARIES):${Python_LIBRARIES}" )
message(STATUS "include_directories(Python_LIBRARY_DIRS):${Python_LIBRARY_DIRS}" )
参考
解決した後に調べたら参考になる記事がありました。