将 Eigen 库与 cppyy 一起使用

Use the Eigen library with cppyy

我已经成功地使用了 cppyy for automatic python bindings for a C++ project I'm working on. I recently included the Eigen 库,但是我在将它与 cppyy 一起使用时遇到了问题。有没有人有这样做的经验,或者知道我应该怎么做?

我的回购结构如下(仅显示相关部分):

.
├── CMakeLists.txt
├── build
├── external
   ── eigen
├── include
   ── all .hpp files
├── src
   ── all .cpp files
├── python
   ── qmc.py

此处 external/eigenEigen 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 的 header,我就会收到错误消息。我已经尝试了几乎所有我能想到的方法(包括需要的 header 一个一个地手动添加,将整个库复制到构建目录等)但无论我做什么,都会弹出相同类型的错误。像

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 还需要包含 header 文件。同样,这适用于我自己的 headers,但无法找到本征 headers...

调用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。 这样, auto-loading 应该可以工作。 IE。无需在您自己的代码中处理库和 headers。