python - 将 Eigen 库与 cppyy 一起使用
问题描述
我已经成功地将cppyy用于我正在处理的 C++ 项目的自动 python 绑定。我最近包含了Eigen库,但我无法将它与 cppyy 一起使用。有没有人有这样做的经验,或者知道我应该怎么做?
我有以下回购结构(仅显示相关部分):
.
├── CMakeLists.txt
├── build
├── external
── eigen
├── include
── all .hpp files
├── src
── all .cpp files
├── python
── qmc.py
这external/eigen
是Eigen GitHub repo的副本。该qmc.py
文件是 cppyy 魔法发生的地方,它看起来像这样(在尝试添加 Eigen 之前,这工作得很好)
import cppyy
import tempfile
import os
import glob
try:
current_dir = os.path.dirname(__file__)
except NameError:
current_dir = os.getcwd()
source_dir = os.path.dirname(current_dir)
install_dir = os.path.join(source_dir, 'build')
include_dir = os.path.join(source_dir, 'include')
eigen_dir = os.path.join(source_dir, 'external', 'eigen')
print(current_dir, source_dir, include_dir, install_dir)
def cmake_run(build_type='Release', c_compiler='gcc', cxx_compiler='g++'):
os.environ['CC'] = c_compiler
os.environ['CXX'] = cxx_compiler
os.system('cd {} && cmake {} -DCMAKE_BUILD_TYPE={}'.format(install_dir, source_dir, build_type))
def load_library():
os.system('cd {} && make engine'.format(install_dir))
libraries = glob.glob(os.path.join(install_dir, 'libengine.*'))
print('Found libraries: {}'.format(libraries))
library = libraries[0]
cppyy.load_library(library)
for header in glob.glob(os.path.join(include_dir, '*.hpp')):
print('Loading {}'.format(header))
cppyy.include(header)
构建部分可以工作,但是一旦我尝试加载任何使用 Eigen 的标头,就会出现错误。我已经尝试了几乎所有我能想到的东西(一个一个地手动包含所需的头文件,将整个库复制到构建目录等),但无论我做什么,都会弹出相同类型的错误。就像是
In file included from
/path/to/repo/projects/include/myheader.hpp:3:10: fatal error: 'Eigen/Dense' file not found
#include <Eigen/Dense>
^~~~~~~~~~~~~
任何有关此处更改内容的帮助将不胜感激!
编辑:需要明确的是,构建步骤工作得很好,即代码编译、链接和运行。使用 cppyy 加载库也可以。问题是 cppyy 还需要包含头文件。同样,这适用于我自己的标题,但无法找到 Eigen 标题...
解决方案
调用 help() 时,有:
>>> import cppyy
>>> help(cppyy)
"""
add_include_path(path)
Add a path to the include paths available to Cling.
"""
>>>
因此,eigen_dir
作为通往 Eigen 的道路,这应该是门票:
cppyy.add_include_path(eigen_dir)
不过,有更好的方法,因为您已经在使用 cmake。请参阅此仓库: https ://github.com/jclay/cppyy-knearestneighbors-example 。这样,自动加载应该可以工作。即无需在您自己的代码中处理库和头文件。
推荐阅读
- html - 使用 R Markdown 的 YAML 编写的代码添加徽标图像
- reactjs - 如何在不修改原始数据的情况下编辑 Gatsby GraphQL 数据
- javascript - Chrome 扩展开发:chrome.storage.local vs Indexeddb
- javascript - 如何访问对象的名称属性
- wordpress - wordpress 更新永久链接结构
- ruby-on-rails - Ruby on Rails:rails g 脚手架不生成任何视图
- javascript - 检测函数是否在 React 的另一个组件中被调用
- goland - 在 Goland 中转到对象类型定义的快速方法
- python - Pandas 根据条件返回索引和列名
- php - php如何在有许多斜杠的错字的情况下强制重定向