Используйте библиотеку Eigen с cppyy - PullRequest
0 голосов
/ 17 декабря 2018

Я успешно использую cppyy для автоматической привязки Python для проекта C ++, над которым я работаю.Недавно я включил библиотеку Eigen , но у меня проблемы с использованием этого вместе с cppyy.У кого-нибудь есть опыт в этом деле, или знаете, как мне это сделать?

У меня есть следующая структура для репо (показаны только соответствующие части):

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

Здесь 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)

Сборочная часть работает, но как только я пытаюсьзагрузить любой заголовок, который использует 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 также должен включать заголовочные файлы.Опять же, это работает для моих собственных заголовков, но не может найти собственные заголовки ...

1 Ответ

0 голосов
/ 30 декабря 2018

При вызове 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. При этом автозагрузка должна работать.Т.е. не нужно разбираться с библиотеками и заголовками в собственном коде.

...