在CMakeLists中包含目录的更好方法.txt
Better way to include a directory in CMakeLists.txt
对于我当前的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(这是微不足道的(。
- 初始化具有非默认构造函数的std::数组项的更好方法
- Protobuf中重复字段的问题.使用重复字段进行序列化/反序列化的更好方法是什么?
- 编写按初始值循环的循环的更好方法是什么
- 用 c++ 为游戏制作"bullet"的更好方法?
- 在CMakeLists中包含目录的更好方法.txt
- 将QDomDocument数据用作文本的更好方法
- C++ - 创建具有相同字符的特定大小的以 null 结尾的 c 样式字符串的更好方法
- 在 sqlite3 中批量插入的更好方法C++
- 设计许多单例代码结构的更好方法
- 使用继承的类模板避免公共成员不可见和源代码膨胀/重复的更好方法
- 在初始化列表中初始化数组的更好方法
- 将对象从一个 std::d eque 移动到另一个的更好方法
- 请告诉我在巴泽尔拥有多平台工作空间的更好方法
- 构造具有大量数据的对象的更好方法(C++)
- 从2D矢量中找出最小尺寸的向量元素的更好方法
- 在C++中创建不可变对象的更好方法
- 在构造函数中组织初始值设定项列表的更好方法
- std::copy with return values - 防止"expression: string iterators incompatible"的更好方法?
- 删除数组成员的更好方法是什么?
- 在C 中操作数据的更好方法是什么