查找用于与 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()
我参与了一些项目,用 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()