在CMakeLists中包含目录的更好方法.txt

Better way to include a directory in CMakeLists.txt

本文关键字:更好 方法 txt CMakeLists 包含目      更新时间:2023-10-16

对于我当前的CMake项目,我需要numpy/ndarrayobject.h库。起初,该项目没有编译,并抱怨在包含路径中找不到numpy/ndarrayobject.h

所以我做的是sudo find / -type f -name 'ndarrayobject.h',它吐了出来:

/usr/lib/python3.8/site-packages/numpy/core/include/numpy/ndarrayobject.h

我包含在CMakeLists.txt

include_directories(/usr/lib/python3.8/site-packages/numpy/core/include/)

因此,这里没有实际错误。该项目按照我的预期编译和工作。但是,我认为必须有一种更聪明的方法来查找目录。我见过CMake项目使用

find_package(PythonLibs 3 REQUIRED)
find_package(OpenCV REQUIRED)

或类似的东西。所以我最初的想法是了解这样的宏,以更智能地包含numpy目录。

这些宏叫什么?它们在哪里定义?我在哪里可以了解它们?上述目录是否存在这样的宏?

这可能是错误的方法,并且有一种更干净的方法来查找和包含上述目录?

但是,我认为必须有更聪明的方法

是的,你是对的,你走在正确的轨道上。

这些宏叫什么?它们在哪里定义?我在哪里可以了解它们?

这些被称为"查找模块",通常位于(假设Unix/Linux(:/usr/local/share/cmake-<version>。您可以在官方文档中了解它们:https://cmake.org/cmake/help/v3.14/manual/cmake-developer.7.html#find-modules

但是:查找 NumPy 的功能似乎已在 CMake 3.14: https://cmake.org/cmake/help/v3.14/module/FindPython3.html 中添加。

因此,假设您使用的是CMake 3.14或更高版本,这应该可以解决问题:

find_package(Python3 REQUIRED COMPONENTS NumPy)
# Use PUBLIC or INTERFACE scope if you need to
# propagate the include folder to dependents
target_include_directories(<your target> PRIVATE ${Python3_NumPy_INCLUDE_DIRS})

这里我们使用FindPython3.cmake,它导出了与 Python 相关的一堆变量,包括您需要的变量:Python3_NumPy_INCLUDE_DIRS

编辑:正如@Pedro正确指出的那样,您还可以链接到NumPy并以这种方式访问其包含。这实际上是可取的,因为在构建应用程序时,您可能必须链接到 NumPy 库,这使您不必发出两个单独的命令。

target_link_libraries(<your target> Python3::NumPy)

现在您可以包含所述标头:#include <numpy/ndarrayobject.h>

如果您无法使用 CMake 3.14 或更高版本,您可以查阅最新的查找模块以了解它是如何完成的,只需编写自己的模块,或者从源代码构建最新的 CMake(这是微不足道的(。