Shared Library von Python nach C++ linken



  • Hallo allerseits.

    Ich versuche gerade die Software Fenics (siehe https://fenicsproject.org/) auf meinem Laptop mit openSuse 15 selbst zu kompilieren. Das Hauptpaket namens Dolfin besteht im Wesentlichen aus 2 Shared Objects:

    • einer in C++ geschrieben Kernkomponente
    • einer Schnittstelle für die Sprache Python

    Kompilieren und Linken funktioniert soweit, die C++-Demos funktionieren auch, aber wenn ich ein Python-Beispiel ausführe kommt folgender Fehler aus dem Python-Interface:

    ImportError: /usr/lib64/python3.6/site-packages/fenics_dolfin-2018.2.0.dev0-py3.6-linux-x86_64.egg/dolfin/cpp.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZTch0_v0_n80_NK6dolfin14LinearOperator8instanceEv
    

    In der C++-Lib ist das Symbol fast (!) enthalten:

    > ldd /usr/lib64/python3.6/site-packages/fenics_dolfin-2018.2.0.dev0-py3.6-linux-x86_64.egg/dolfin/cpp.cpython-36m-x86_64-linux-gnu.so | grep libdolfin
            libdolfin.so.2018.2 => /usr/local/lib64/libdolfin.so.2018.2 (0x00007f3e6c513000)
    > nm -D /usr/local/lib64/libdolfin.so.2018.2 | grep LinearOperator8instanceEv
    000000000063f6f0 T _ZN6dolfin14LinearOperator8instanceEv
    000000000063f6b0 T _ZNK6dolfin14LinearOperator8instanceEv
    000000000063f680 T _ZTcv0_n32_v0_n80_NK6dolfin14LinearOperator8instanceEv
    000000000063f6c0 T _ZTcv0_n40_v0_n80_N6dolfin14LinearOperator8instanceEv
    

    HIer versteh ich die Welt nicht mehr. Der Unterschied besteht ja nur im Prefix (ZTch0_v0_n80 vs. _ZTcv0_n40_v0_n80). Kann mir jemand sagen was diese Nummern zu bedeuten haben? Diese haben ja nichts mit dem Namen und Namespace der Klasse LinearOperator zu tun. Hier noch die Definition der Klasse aus dem entsprechenden Header:

    namespace dolfin
    {
      class LinearOperator : public GenericLinearOperator
      {
      ...
      };
    }
    

    Auf der Projektwebseite habe ich leider keine Hinweise auf diesen Fehler gefunden. Vermutlich mache ich irgendetwas unerwartetes. Der Fehler tritt auch erst auf seit ich die Kernkomponente mit dem Intel-Compiler und nicht mehr mit GCC kompiliert habe. Könnte das derartige Fehler verursachen?

    Sorry falls ich hier das Forum erwischt haben sollte. Habe lange überlegt ob ich es in die Rubrik "Linux" schreibe.

    Vielen Dank schonmal.



  • c++filt _ZTch0_v0_n80_NK6dolfin14LinearOperator8instanceEv
    ergibt: covariant return thunk to dolfin::LinearOperator::instance() const



  • Danke, damit weiß ich zumindest mal welche Methode das Problem verursacht.

    Ich habe es allerdings nicht geschafft den Fehler zu beheben. Ich habe mal nach der Definition der Methode gesucht und diese hier gefunden:

    virtual const GenericLinearOperator* instance() const;
    virtual GenericLinearOperator* instance(); 
    

    In der Klasse GenericLinearOperator taucht die Methode nicht auf. Im entsprechenden cpp-File sind die Methoden wie folgt implementiert:

    const GenericLinearOperator* LinearOperator::instance() const
    {
      return _matA.get();
    }
    //-----------------------------------------------------------------------------
    GenericLinearOperator* LinearOperator::instance()
    {
      return _matA.get();
    }
    

    Ich verstehe diesen Fehler immer noch nicht. Hat jemand eine Idee?

    Vielen Dank schonmal.