web-dev-qa-db-fra.com

Utilisez la bibliothèque Eigen avec cppyy

J'utilise avec succès cppyy pour les liaisons python automatiques dans un projet C++ sur lequel je travaille. J'ai récemment inclus la bibliothèque Eigen , mais je ne parviens pas à l'utiliser avec cppyy. Quelqu'un at-il une expérience dans ce domaine ou sait-il comment procéder? 

J'ai la structure suivante pour le repo (uniquement les parties pertinentes montrées):

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

Ici, le external/eigen est une copie du Eigen GitHub repo . Le fichier qmc.py est l'endroit où la magie cppyy se produit et il se présente comme ceci (avant d'essayer d'ajouter Eigen, cela fonctionne parfaitement)

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)

La partie construction fonctionne, mais dès que j'essaie de charger un en-tête utilisant Eigen, une erreur se produit. J'ai essayé à peu près tout ce à quoi je peux penser (inclure manuellement les en-têtes nécessaires un par un, copier toute la bibliothèque dans le répertoire de construction, etc.), mais peu importe ce que je fais, le même type d'erreurs apparaît. Quelque chose comme 

In file included from 
/path/to/repo/projects/include/myheader.hpp:3:10: fatal error: 'Eigen/Dense' file not found
#include <Eigen/Dense>
         ^~~~~~~~~~~~~

Toute aide pour changer ici serait très appréciée!

Edit: Pour être clair, l’étape de compilation fonctionne très bien, c’est-à-dire que le code compile, lie et fonctionne comme il se doit. Charger la bibliothèque avec cppyy fonctionne aussi. Le problème est que cppyy doit également inclure les fichiers d’en-tête. Encore une fois, cela fonctionne pour mes propres en-têtes, mais il est impossible de trouver les en-têtes Eigen ...

7
Bendik

Lorsque vous appelez help (), il y a:

>>> import cppyy
>>> help(cppyy)
    """
    add_include_path(path)
        Add a path to the include paths available to Cling.
    """
>>>

Donc, avec eigen_dir étant le chemin d'accès à Eigen, cela devrait être le ticket:

cppyy.add_include_path(eigen_dir)

Il existe cependant de meilleurs moyens, puisque vous utilisez déjà cmake. Voir ce repo: https://github.com/jclay/cppyy-knearestneothers-example . Avec cela, le chargement automatique devrait fonctionner. C'est à dire. pas besoin de traiter avec les bibliothèques et les en-têtes dans votre propre code.

1
Wim Lavrijsen