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;
...