【发布时间】:2018-12-17 15:59:25
【问题描述】:
我已经成功地将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 标题...
【问题讨论】:
-
您可以手动查找
Dense文件吗?什么是绝对路径? -
@AviGinsburg 我可以让 cppyy 包含任何一个特定的标头,例如,包括带有完整路径的
Eigen/Dense。例如cppyy.include(os.path.join(eigen_dir, 'Eigen', 'Dense'))找到文件。但是在这里我遇到了其他文件未找到的问题,奇怪的是它抱怨找不到assert.h。我担心这只是我的系统特有的一些配置错误,因此很难获得帮助...... -
external/eigen是否出现在CMakeLists.txt中?如果没有,请尝试添加include_directories(external/eigen)。 -
@mingaleg 我有那个,是的。我已将问题更新为更清晰,但问题不在于 cmake,因为代码构建得很好。该问题与使用 cppyy 有关。
标签: python c++ eigen python-c-api