Ich versuche gerade ein altes Programm wieder zu beleben. Ich hatte damals in ein Programm eine Rechtschreibprüfung mit Enchant eingebaut, was für mich nicht einfach war.
Jetzt versuche ich, das Programm auf Arch Linux zum laufen zu bekommen, aber inzwischen gibt es Enchant-2 und das stäubt sich.
Früher brauchte ich nur folgenden Header einzubinden:
#include <enchant/enchant++.h>
Aber wenn ich die Zeile jetzt anpasse, bekomme ich folgenden Fehler:
#include <enchant-2/enchant++.h>

In Datei, eingebunden von zk_spell.h:32,
                 von zk_spell.cpp:11:
/usr/include/enchant-2/enchant++.h:33:10: schwerwiegender Fehler: enchant.h: Datei oder Verzeichnis nicht gefunden
   33 | #include <enchant.h>
      |          ^~~~~~~~~~~
Kompilierung beendet.

Dabei befinden sich beide Header Dateien im selben Verzeichnis. Auch wenn ich beide Dateien eingebe kommt dieser Fehler. Die Suchmaschine meines geringsten Misstrauens wollte mir nur Python Lösungen anbieten, obwohl ich C und C++ angegeben hatte.
Wie könnte ich da weiter kommen?

Hier scheint erwartet zu werden, daß der Compiler mit -I/usr/include/enchant-2 schon weiß, wo er nach diesen Dateien zu suchen hat.

Sonst müsste man in dieser .h Datei auch #include <enchant-2/...> schreiben. Dort steht jedoch nur include <enchant.h>.

Danke, damit bin ich zumindest einen kleinen Schritt weiter. Da hätte ich aber möglicherweise auch selber drauf kommen können, denn ich hatte mir mir den Quelltext, nicht aber Makefile angesehen. Da musste auch "-2" ergänzt werden:
CXXFLAGS = $(shell fltk-config --use-images --cxxflags ) -Wall -no-pie -I/usr/include/enchant-2 -DSPELLCK
Aber jetzt zeigen sich natürlich auch die Unterschiede zu Enchant-1.

In Datei, eingebunden von zk_spell.cpp:11:
zk_spell.h:89:5: Fehler: »enchant« bezeichnet keinen Typ
   89 |     enchant::Broker *   broker;   // enchant::Broker is static in version 1.6.0-10
      |     ^~~~~~~

Da liegt wohl noch viel Anpassungsarbeit vor mir. Was mich aber überrascht. Denn die Binärdatei, die ich damals auf Ubuntu 18.04 erzeugt hatte, konnte ich problemlos auf Debian-11 (inzwischen platt gemacht) kopieren. Ich musste nur zusätzlich einen symbolischen Link auf Enchant-2 anlegen.
Ich finde, dass Enchant nicht gerade besonders gut dokumentiert ist. Auf der Homepage wird zwar ein Link auf das c/c++ ABI angeboten, aber da landet man nur auf dem Quelltext einer HTML Seite mit viel Javascript. Da muss ich mich wohl, wie damals auch, mühsam durch die Header Dateien kämpfen. Das kann (wieder) dauern.

Ich kenne enchant leider gar nicht. Manchmal gibt es ja entsprechende Guides, wie man alte Sachen umstellen kann.

Auf der enchant Homepage und Github sehe ich dazu auf die schnelle nichts. Da wird schon von Enchant-3 geredet. ;-)

Wenns dir egal ist, man kann allem Anschein nach auch noch enchant v1 bauen. Das wird halt nur im ArchLinux Paket nicht so ausgeliefert. Baust du selbst.

Ich denke nicht, dass es eine gute Idee ist, bei v1 zu bleiben. Die eigentlichen Prüfprogramme werden ja weiter entwickelt. Da wird die v1 wohl irgendwann nicht mehr funktionieren.
Und wie das so ist, reduzieren sich manche Probleme über Nacht. Ich hatte doch glatt vergessen eine auskommentierte Zeile wieder zu aktivieren. Momentan habe ich nur noch eine Fehlerzeile:

zk_spell.cpp: In Konstruktor »zk_spell::zk_spell(Fl_Text_Buffer*, const char*)«:
zk_spell.cpp:78:31: Fehler: »instance« ist kein Element von »enchant::Broker«
   78 |     broker = enchant::Broker::instance();
      |                               ^~~~~~~~

instance() wurde tatsächlich entfernt. Das war wohl so etwas wie ein "versteckter" Konstruktor. Jedenfalls bekam ich damit einen Zeiger auf eine Broker-Instanz. Ich werde gleich mal sehen, was der normale Konstuktor macht und ob dann neue Fehler auftreten.

Nachtrag:
Nachdem ich auch die Linker Anweisung korrigiert hatte, funktionierte das Programm erst mal. Hat auch einige Fehler gefunden. In de Konsole bekomme ich allerdings einige Warnungen:

(process:1923): libenchant-WARNING **: 17:16:20.487: broker.vala:159: Error loading plugin: libhspell.so.0: cannot open shared object file: No such file or directory
(process:1923): libenchant-WARNING **: 17:16:20.487: broker.vala:159: Error loading plugin: libaspell.so.15: cannot open shared object file: No such file or directory
(process:1923): libenchant-WARNING **: 17:16:20.487: broker.vala:159: Error loading plugin: libnuspell.so.5: cannot open shared object file: No such file or directory
(process:1923): libenchant-WARNING **: 17:16:20.488: broker.vala:159: Error loading plugin: libvoikko.so.1: cannot open shared object file: No such file or directory

Leider stehe ich mit dem Problem wieder dort, wo ich 2018 schon einmal war. Ob es funktioniert, hängt irgendwie davon ab, in welcher Reihenfolge die Dateien compiliert wurden. Ich kann wählen zwischen zwei Fehlern:

/usr/bin/ld: NoteBox.o: in function `Fl::event_x()':
/usr/include/enchant-2/enchant++.h:40: multiple definition of `enchant::set_prefix_dir(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'; zk3.o:/usr/include/enchant-2/enchant++.h:40: first defined here
/usr/bin/ld: zk_spell.o: in function `Fl_Group::as_group()':
/usr/include/enchant-2/enchant++.h:40: multiple definition of `enchant::set_prefix_dir(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'; zk3.o:/usr/include/enchant-2/enchant++.h:40: first defined here

(kommt vier oder fünf Mal) oder:

In Datei, eingebunden von NoteBox.h:35,
                 von zk3.cpp:111:
zk_spell.h:90:5: Fehler: »enchant« bezeichnet keinen Typ
   90 |     enchant::Broker *   broker;
      |     ^~~~~~~
zk_spell.h:91:5: Fehler: »enchant« bezeichnet keinen Typ
   91 |     enchant::Dict *     dict;
      |     ^~~~~~~
make: *** [makefile:61: zk3.o] Fehler 1

Das Problem entsteht wohl so:
Die Klasse NoteBox verwendet zk_spell und includiert dazu zk_spell.h
zk_spell.h wiederum includiert enchant++.h
zk_spell.cpp includiert aber auch enchant++.h
Das dürfte eigentlich nicht zu Problemen führen denn enchant++.h geht so:

#ifndef ENCHANT_PLUS_PLUS_H
#define ENCHANT_PLUS_PLUS_H
---
namespace enchant
{
	void set_prefix_dir (const std::string prefix) {
		enchant_set_prefix_dir (prefix.c_str ());
	}

	class Broker;

	class Exception : public std::exception
		{
...

Ich hatte damals also versucht, enchant++.h vor NoteBox.cpp zu verstecken, was aber damals wie heute nicht zuverlässig funktioniert (warum kann ich aber nicht nachvollziehen). Ich hatte versucht, dass über ein Makro zu steuern. Geht aber nicht, weil der Compiler jede Header Datei nur einmal lädt.
Wie komme ich da raus? Denn die zk_spell.h Datei benötigt ja auch enchant++.h wegen:

class
zk_spell {
    enchant::Broker *   broker;
    enchant::Dict *     dict;
...