查找用于与 CMake 交叉编译的主机包

Find host package for cross-compiling with CMake

我参与了一些项目,用 C 语言开发一个库。

我们项目中的单元测试 运行 python 用于生成测试数据的脚本。

为Linux或Windows编译项目时,在CMakeLists.txt中调用find_package(Python3 COMPONENTS Interpreter Development NumPy)效果很好:成功找到Python,数据生成。

然而,当项目在 Windows 上针对某些嵌入式平台进行交叉编译时,对 find_package(Python3...) 的调用总是失败。

最近我了解到可以使用内部 CMake 变量对其进行调试 CMAKE_FIND_DEBUG_MODE

所以,我在命令中包装了对 find_package 的调用,将此变量设置为 ON,然后 OFF。

调试日志的相关部分如下:

CMake Debug Log at C:/Program Files/CMake/share/cmake-3.19/Modules/FindPython/Support.cmake:2681 (find_library):
  find_library called with the following settings:

    VAR: _Python3_LIBRARY_RELEASE
    NAMES: "python37"
           "python3.7"
    Documentation: Path to a library.
    Framework
      Only Search Frameworks: 0
      Search Frameworks Last: 0
      Search Frameworks First: 0
    AppBundle
      Only Search AppBundle: 0
      Search AppBundle Last: 0
      Search AppBundle First: 0
    CMAKE_FIND_USE_CMAKE_PATH: 1
    CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH: 1
    CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH: 0
    CMAKE_FIND_USE_CMAKE_SYSTEM_PATH: 0
   
  find_library considered the following locations:

    C:/Anaconda3/envs/py37/lib/(lib)python37(\.so|\.a)
    C:/Anaconda3/envs/py37/lib/(lib)python3.7(\.so|\.a)
    C:/Anaconda3/envs/py37/libs/(lib)python37(\.so|\.a)
    C:/Anaconda3/envs/py37/libs/(lib)python3.7(\.so|\.a)
    C:/Anaconda3/envs/py37/lib/python3.7/config-3.7/(lib)python37(\.so|\.a)
    C:/Anaconda3/envs/py37/lib/python3.7/config-3.7/(lib)python3.7(\.so|\.a)
    C:/Anaconda3/envs/py37/(lib)python37(\.so|\.a)
    C:/Anaconda3/envs/py37/(lib)python3.7(\.so|\.a)
    ... other paths

  The item was not found.

python 库的正确路径是 C:\Anaconda3\envs\py37\libs\python37.lib。包含此文件的目录出现在上面目录列表的第三位。因此,如果 CMake 搜索扩展名为 .lib 的文件,它会找到它。

但是,扩展名 .lib.dll 从未出现在日志中。

同时找到python解释器的可执行文件

我认为,这是因为 CMake 试图为目标平台找到 python。但是,我需要在主机上 运行 python

是否可以切换此行为?

搜索“cmake find_host_package”只带来this macro wrapping original find_package,这是不正确的

通过从请求的组件中删除“开发”解决了问题:

if(CMAKE_CROSSCOMPILING)
    find_package(Python3 COMPONENTS Interpreter NumPy)
else()
    find_package(Python3 COMPONENTS Interpreter Development NumPy)
endif()