LoginSignup
2
1

More than 1 year has passed since last update.

CMakeListsでfind_packageした時にPythonモジュールが見つからなかった場合

Last updated at Posted at 2023-02-25

先に結論

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_required3.12 にして、FindPythonLibsFindPython3に変更すれば解決になりそうではありますが、そこまで上げられない場合には両方サポートしてあげたほうが良さそうです。(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}" )

参考

解決した後に調べたら参考になる記事がありました。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1