Ben*_*dik 7 c++ python python-c-api eigen
我已经成功地使用cppyy为我正在研究的C++项目进行自动python绑定.我最近加入了Eigen库,但是我很难和cppyy一起使用它.有没有人有这方面的经验,或者知道我应该怎么做?
我有回购的以下结构(仅显示相关部分):
.
??? CMakeLists.txt
??? build
??? external
?? eigen
??? include
?? all .hpp files
??? src
?? all .cpp files
??? python
?? qmc.py
Run Code Online (Sandbox Code Playgroud)
这里external/eigen是Eigen GitHub回购的副本.该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)
Run Code Online (Sandbox Code Playgroud)
构建部分工作,但是一旦我尝试加载任何使用Eigen的头,我就会收到错误.我已经尝试了所有我能想到的东西(逐个手动包含所需的标题,将整个库复制到构建目录等)但是无论我做什么,都会弹出相同类型的错误.就像是
In file included from
/path/to/repo/projects/include/myheader.hpp:3:10: fatal error: 'Eigen/Dense' file not found
#include <Eigen/Dense>
^~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
任何有关如何改变的帮助将不胜感激!
编辑:要清楚,构建步骤工作正常,即代码编译,链接和运行应该.使用cppyy加载库也有效.问题是cppyy还需要包含头文件.同样,这适用于我自己的标题,但它无法找到Eigen标题...
调用help()时,有:
>>> import cppyy
>>> help(cppyy)
"""
add_include_path(path)
Add a path to the include paths available to Cling.
"""
>>>
Run Code Online (Sandbox Code Playgroud)
因此,作为eigen_dir通往 Eigen 的路径,这应该是门票:
cppyy.add_include_path(eigen_dir)
Run Code Online (Sandbox Code Playgroud)
不过,还有更好的方法,因为您已经在使用 cmake。请参阅此存储库: https://github.com/jclay/cppyy-knearestneighbors-example。这样,自动加载就可以工作了。即无需在您自己的代码中处理库和标头。