wake-up-neo.net

Verwenden Sie die Eigen-Bibliothek mit cppyy

Ich habe cppyy erfolgreich für automatische Python-Bindungen für ein C++ - Projekt verwendet, an dem ich arbeite. Ich habe kürzlich die Eigen - Bibliothek hinzugefügt, aber ich habe Probleme, sie zusammen mit cppyy zu verwenden. Hat jemand Erfahrung damit oder weiß, wie ich das machen soll?

Ich habe die folgende Struktur für das Repo (nur relevante Teile gezeigt):

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

Hier ist der external/eigen eine Kopie des Eigen GitHub repo . In der qmc.py-Datei findet die cppyy-Magie statt, und sie sieht so aus (bevor Sie versuchen, Eigen hinzuzufügen, funktioniert dies einwandfrei).

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)

Der Build-Teil funktioniert, aber sobald ich versuche, einen Header zu laden, der Eigen verwendet, wird eine Fehlermeldung angezeigt. Ich habe so gut wie alles ausprobiert, was mir einfällt (benötigte Header einzeln manuell einfügen, die gesamte Bibliothek in das Erstellungsverzeichnis kopieren usw.), aber unabhängig davon, was ich mache, wird die gleiche Art von Fehlern angezeigt. So etwas wie

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

Jede Hilfe bei der Änderung hier wäre sehr dankbar!

Edit : Um es deutlich zu machen, funktioniert der Build-Schritt einwandfrei, d. H. Der Code wird so kompiliert, verlinkt und ausgeführt, wie er sollte. Das Laden der Bibliothek mit cppyy funktioniert ebenfalls. Das Problem ist, dass cppyy auch die Header-Dateien enthalten muss. Wieder funktioniert dies für meine eigenen Header, aber es ist nicht möglich, die Eigen-Header zu finden ...

7
Bendik

Beim Aufruf von help () gibt es:

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

Da eigen_dir der Pfad zu Eigen ist, sollte dies das Ticket sein:

cppyy.add_include_path(eigen_dir)

Es gibt jedoch bessere Möglichkeiten, da Sie cmake bereits verwenden. Siehe dieses Repo: https://github.com/jclay/cppyy-knearestneighbors-example . Damit sollte das automatische Laden funktionieren. Das heißt Sie müssen sich nicht mit Bibliotheken und Headern in Ihrem eigenen Code befassen.

1
Wim Lavrijsen