makefile-Probleme: wo überhaupt anfangen?
-
Hallo,
ich habe versucht, ein opensource-Projekt (sanddra 1.0.0 aus dem
download-Bereich von http://www.kinness.net) unter ubuntu
zu compilieren.
Wenn ich einfach den makefile nach Anleitung ausführe, kriege
ich jede Menge Fehlermeldungen../configureläuft problemlos durch,
make installbringt die folgenden Meldungen (nur ein Ausschnitt):
Making install in sanndra
make[1]: Entering directory/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra' if /bin/bash ../libtool --silent --mode=compile --tag=CXX g++ -DHAVE\_CONFIG\_H -I. -I. -I.. -Wnon-virtual-dtor -Wno-long-long -Wundef -ansi -D\_XOPEN\_SOURCE=500 -D\_BSD\_SOURCE -Wcast-align -Wconversion -Wchar-subscripts -Wall -W -Wpointer-arith -Wwrite-strings -O2 -Wformat-security -Wmissing-format-attribute -fno-exceptions -fno-check-new -fno-common -fexceptions -MT unit.lo -MD -MP -MF ".deps/unit.Tpo" \ -c -o unit.lo \test -f 'unit.cpp' || echo './'`unit.cpp; \
then mv -f ".deps/unit.Tpo" ".deps/unit.Plo"; \
else rm -f ".deps/unit.Tpo"; exit 1; \
fi
In file included from internal.h:32:0,
from gates.h:29,
from projection.h:29,
from unit.h:29,
from unit.cpp:27:
rates.h: In member function 'virtual T TExponRate<T>::operator()(T) const':
rates.h:92:47: error: 'A' was not declared in this scope
rates.h: In member function 'T TExponRate<T>::calcexp(T) const':
rates.h:99:38: error: 'V0' was not declared in this scope
rates.h:99:46: error: 'B' was not declared in this scope
rates.h: In member function 'virtual T TSigmoidRate<T>::operator()(T) const':
rates.h:127:47: error: 'A' was not declared in this scope
rates.h: In member function 'virtual T TLinoidRate<T>::operator()(T) const':
rates.h:157:47: error: 'V0' was not declared in this scope
rates.h:158:60: error: 'A' was not declared in this scope
rates.h:158:89: error: 'B' was not declared in this scope
rates.h: In member function 'virtual T TParamRate<T>::operator()(T) const':
rates.h:185:47: error: 'A' was not declared in this scope
rates.h: In member function 'virtual T TExtParamRate<T>::operator()(T) const':
rates.h:220:52: error: 'A' was not declared in this scope
rates.h:220:61: error: 'B' was not declared in this scope
In file included from gates.h:29:0,
from projection.h:29,
from unit.h:29,
from unit.cpp:27:
internal.h: In member function 'virtual T TMTauGating<T>::init(T)':
internal.h:59:43: error: 'm_a' was not declared in this scope
internal.h: In member function 'virtual T TMTauGating<T>::operator()(T) const':
internal.h:62:47: error: 'm_b' was not declared in this scope
internal.h:62:52: error: 'm_a' was not declared in this scope
internal.h: In member function 'virtual T TEq_DualExp<T>::fill(size_t)':
internal.h:98:51: error: 'm_tf' was not declared in this scope
internal.h: In member function 'virtual T TReducedModulated<T>::operator()(T, T)':
internal.h:123:48: error: 'm_threshold' was not declared in this scope
In file included from gates.h:30:0,
from projection.h:29,
from unit.h:29,
from unit.cpp:27:
formulas.h: In constructor 'TRandom<T>::TRandom(long unsigned int)':
formulas.h:66:22: error: 'ULONG_MAX' was not declared in this scope
In file included from projection.h:29:0,
from unit.h:29,
from unit.cpp:27:
gates.h: In member function 'virtual void TIntegrChemGate<T>::calc(T, T&, size_t&, size_t&) const':
gates.h:482:11: error: 'm_eq' was not declared in this scope
In file included from equations.h:32:0,
from unit.cpp:30:
channels.h: In member function 'virtual T TInjectedChannel<T>::calculate(T, typename std::vector<TInput<T>>::iterator&)':
channels.h:124:60: error: there are no arguments to 'gBar' that depend on a template parameter, so a declaration of 'gBar' must be available [-fpermissive]
channels.h:124:60: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
channels.h: In member function 'virtual T TMultiChannel<T>::calculate(T, typename std::vector<TInput<T>>::iterator&)':
channels.h:169:116: error: there are no arguments to 'gBar' that depend on a template parameter, so a declaration of 'gBar' must be available [-fpermissive]
channels.h:172:96: error: there are no arguments to 'nernst' that depend on a template parameter, so a declaration of 'nernst' must be available [-fpermissive]
channels.h: In member function 'virtual void TMultiChannel<T>::init(typename std::vector<TInput<T>>::iterator&, T&, T&)':
channels.h:187:101: error: there are no arguments to 'gBar' that depend on a template parameter, so a declaration of 'gBar' must be available [-fpermissive]
channels.h:190:110: error: there are no arguments to 'nernst' that depend on a template parameter, so a declaration of 'nernst' must be available [-fpermissive]
channels.h: In member function 'virtual T TReducedChannel<T>::calculate(T, typename std::vector<TInput<T>>::iterator&)':
channels.h:236:41: error: there are no arguments to 'gBar' that depend on a template parameter, so a declaration of 'gBar' must be available [-fpermissive]
channels.h: In member function 'virtual T TGapJunction<T>::calculate(T, typename std::vector<TInput<T>>::iterator&)':
channels.h:287:122: error: there are no arguments to 'gBar' that depend on a template parameter, so a declaration of 'gBar' must be available [-fpermissive]
channels.h: In member function 'virtual void TGapJunction<T>::init(typename std::vector<TInput<T>>::iterator&, T&, T&)':
channels.h:300:98: error: there are no arguments to 'gBar' that depend on a template parameter, so a declaration of 'gBar' must be available [-fpermissive]
channels.h:300:112: error: there are no arguments to 'gBar' that depend on a template parameter, so a declaration of 'gBar' must be available [-fpermissive]
channels.h: In member function 'virtual T TMGapJunction<T>::calculate(T, typename std::vector<TInput<T>>::iterator&)':
channels.h:331:124: error: there are no arguments to 'gBar' that depend on a template parameter, so a declaration of 'gBar' must be available [-fpermissive]
channels.h: In member function 'virtual void TMGapJunction<T>::init(typename std::vector<TInput<T>>::iterator&, T&, T&)':
channels.h:351:99: error: there are no arguments to 'gBar' that depend on a template parameter, so a declaration of 'gBar' must be available [-fpermissive]
In file included from unit.cpp:30:0:
equations.h: In member function 'T TEq_Membrane<T>::operator()(T) const':
equations.h:138:94: error: 'm_inputs' was not declared in this scope
equations.h: In member function 'virtual T TEq_Membrane<T>::equilibrium() const':
equations.h:146:108: error: 'm_inputs' was not declared in this scope
equations.h: In member function 'virtual T TEq_RCF<T>::calcSum() const':
equations.h:177:89: error: 'm_inputs' was not declared in this scope
In file included from unit.cpp:30:0:
equations.h: In member function 'virtual T TEq_RCF<T>::init() const':
equations.h:209:35: error: 'm_inputs' was not declared in this scope
In file included from fanlink.h:29:0,
from input.cpp:26,
from unit.cpp:32:
slice_itr.h: At global scope:
slice_itr.h:87:23: error: declaration of 'operator==' as non-function
slice_itr.h:87:23: error: expected ';' at end of member declaration
slice_itr.h:87:26: error: expected unqualified-id before '<' token
slice_itr.h:88:23: error: declaration of 'operator!=' as non-function
slice_itr.h:88:23: error: expected ';' at end of member declaration
slice_itr.h:88:26: error: expected unqualified-id before '<' token
slice_itr.h:89:23: error: declaration of 'operator<' as non-function
slice_itr.h:89:23: error: expected ';' at end of member declaration
slice_itr.h:89:25: error: expected unqualified-id before '<' token
slice_itr.h: In member function 'T& slice_iter<T>::ref(size_t) const':
slice_itr.h:76:35: error: 'v' was not declared in this scope
slice_itr.h: At global scope:
slice_itr.h:102:1: warning: keyword 'export' not implemented, and will be ignored [enabled by default]
slice_itr.h: In member function 'T& rslice_iter<T>::ref(size_t) const':
slice_itr.h:123:35: error: 'v' was not declared in this scope
slice_itr.h: At global scope:
slice_itr.h:147:1: warning: keyword 'export' not implemented, and will be ignored [enabled by default]
In file included from input.cpp:26:0,
from unit.cpp:32:
fanlink.h: In member function 'virtual void TLink<T>::calculate()':
fanlink.h:46:3: error: 'm_gate' was not declared in this scope
fanlink.h:46:17: error: 'm_input' was not declared in this scope
fanlink.h:46:26: error: 'm_gvar' was not declared in this scope
fanlink.h:46:34: error: 'm_last' was not declared in this scope
fanlink.h:46:42: error: 'm_ntl' was not declared in this scope
fanlink.h:47:5: error: 'm_learningRule' was not declared in this scope
fanlink.h:47:30: error: 'm_post' was not declared in this scope
fanlink.h: In member function 'virtual void TBasicFanLink<T, A>::calculate()':
fanlink.h:80:4: error: 'm_gate' was not declared in this scope
fanlink.h:85:6: error: 'm_learningRule' was not declared in this scope
fanlink.h:85:35: error: 'm_post' was not declared in this scope
fanlink.h:87:3: error: 'm_gvar' was not declared in this scope
fanlink.h: In member function 'virtual void TBasicFanLink<T, A>::init()':
fanlink.h:92:36: error: 'm_gate' was not declared in this scope
fanlink.h:98:22: error: 'm_gvar' was not declared in this scope
fanlink.h: In member function 'virtual T TModLearningRate<T>::rate()':Ich habe dann versucht, ein Code::Blocks-Projekt anzulegen, und
die Quelldateien manuell zusammenzufügen. Das bringt aber
auch sofort Fehler, z.B. in rates.h:/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h||In member function ‘virtual T TExponRate<T>::operator()(T) const’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h|92|error: ‘A’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h||In member function ‘T TExponRate<T>::calcexp(T) const’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h|99|error: ‘V0’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h|99|error: ‘B’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h||In member function ‘virtual T TSigmoidRate<T>::operator()(T) const’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h|127|error: ‘A’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h||In member function ‘virtual T TLinoidRate<T>::operator()(T) const’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h|157|error: ‘V0’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h|158|error: ‘A’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h|158|error: ‘B’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h||In member function ‘virtual T TParamRate<T>::operator()(T) const’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h|185|error: ‘A’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h||In member function ‘virtual T TExtParamRate<T>::operator()(T) const’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h|220|error: ‘A’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/rates.h|220|error: ‘B’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/internal.h||In member function ‘virtual T TMTauGating<T>::init(T)’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/internal.h|59|error: ‘m_a’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/internal.h||In member function ‘virtual T TMTauGating<T>::operator()(T) const’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/internal.h|62|error: ‘m_b’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/internal.h|62|error: ‘m_a’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/internal.h||In member function ‘virtual T TEq_DualExp<T>::fill(size_t)’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/internal.h|98|error: ‘m_tf’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/internal.h||In member function ‘virtual T TReducedModulated<T>::operator()(T, T)’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/internal.h|123|error: ‘m_threshold’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/formulas.h||In constructor ‘TRandom<T>::TRandom(long unsigned int)’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/formulas.h|66|error: ‘ULONG_MAX’ was not declared in this scope|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/gates.h||In member function ‘virtual void TIntegrChemGate<T>::calc(T, T&, size_t&, size_t&) const’:|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/gates.h|482|error: ‘m_eq’ was not declared in this scope|
||=== Build finished: 17 errors, 0 warnings ===|Da ich zwar schon C++-Programme geschrieben habe, mich aber mit dem
C++-Standard nicht besonders auskenne, weiss ich nicht genau,
wo ich bei der Menge von Fehlermeldungen hier anfangen soll,
überhaupt nach einer Lösung zu suchen.Ist das hier ein Problem mit dem Sprachstandard (bzw. den gcc-Optionen
für den Sprachstandard)?Was kommt als Problemursache hier überhaupt in Frage
(Probleme mit der Ubuntu-Konfiguration? Falsche
GCC-Version? Fehlerhafter Makefile? Tatsächlich fehlerhafter Code?
Eine falsche Compiler-Optionen?)Gibt es vielleicht ein gutes Tutorial zum Debuggen von Makefiles
bzw. zur Diagnose von solchen Problemen mit umfangreichen
open-source Projekten?Danke für jeden Tip!
Ralf
-
Dein Problem hat mit Makefiles nichts zu tun. Das Problem ist der (uralte) C++-Code. Neuere GCCs sind da deutlich pingeliger geworden. Zum Beispiel wurde vor einiger Zeit der Two-Stage-Lookup standardkonform implementiert, was bei so manchem alten Code das Kompilieren verhindert hat.
Wenn du dann seit Ewigkeiten nicht mehr gepflegten Code mit einem aktuellen GCC kompilieren willst, kracht es dann ab und zu. Mit den Schaltern aus deiner Fehlermeldung kannst du dem GCC aber sagen, dass er über solche Fehler im Code hinwegsehen soll. Wenn das nicht in allen Fällen was bringt, musst du dich halt durch den Code wühlen.
Ich persönlich würde ja dazu raten dir einfach ein Projekt zu suchen, das von seinen Entwicklern nicht schon vor fast einem Jahrzehnt dem Bitrot überlassen wurde.
-
Vielen Dank für die klare und hilfreiche Antwort!
Ich bin leider auf den Code angewiesen, weil
ich den für ein spezielles Modell brauche.Also werde ich mich mal durch die Compilerschalter
von gcc wühlen, die sind ja wenigstens
gut dokumentiert, so dass da Hoffnung besteht.Gruß,
Ralf
-
Habe nochmal ein bißchen weiter recherchiert, ein Fehler,
der beim Compilieren des Projektes oft auftaucht, ist dieser:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34184
und wenn ich statt A dann this->A verwende in der ererbten Klasse,
dann verschwindet die Fehlermeldung "A was not declared in this scope".Da der Code aber nun umfangreich ist, kann ich es nicht überall ändern
und es wäre also wieder die Frage:
liegt es an der gcc-Version?
oder kann ich durch Schalter den compiler dazu bringen,
die ererbten Variablen irgendwie zu erkennen?
-
CPP_userx schrieb:
Habe nochmal ein bißchen weiter recherchiert, ein Fehler,
der beim Compilieren des Projektes oft auftaucht, ist dieser:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34184
und wenn ich statt A dann this->A verwende in der ererbten Klasse,
dann verschwindet die Fehlermeldung "A was not declared in this scope".Da der Code aber nun umfangreich ist, kann ich es nicht überall ändern
und es wäre also wieder die Frage:
liegt es an der gcc-Version?
oder kann ich durch Schalter den compiler dazu bringen,
die ererbten Variablen irgendwie zu erkennen?Der einfachste Weg dürfte sein, using-Deklarationen in der abgeleiteten Klasse einzufügen.
-
Das hat geklappt.
Allerding kommt nun eine neue Klasse von Fehlern:z.B. bei der Deklaration:
friend bool operator == <>(const slice_iter<T>&p, const slice_iter<T>&q);gleich drei Fehler:
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/slice_itr.h|87|error: declaration of ‘operator==’ as non-function|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/slice_itr.h|87|error: expected ‘;’ at end of member declaration|/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/slice_itr.h|87|error: expected unqualified-id before ‘<’ token|Kann es denn sein, dass hier ein anderer Sprachstandard verwendet wurde?
Sollte ich vielleicht einen anderen Compiler nehmen?
Oder doch nach einem Schalter fǘr laxere Fehlerbehandlung suchen
(bisher habe ich noch nichts Geeignetes als Compilerschalter gegooglt).
-
CPP_userx schrieb:
z.B. bei der Deklaration:
friend bool operator == <>(const slice_iter<T>&p, const slice_iter<T>&q);gleich drei Fehler:
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/slice_itr.h|87|error: declaration of ‘operator==’ as non-function|
/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/slice_itr.h|87|error: expected ‘;’ at end of member declaration|/home/lxuser/Documents/neural/gross_Smart/sanndra/sanndra/slice_itr.h|87|error: expected unqualified-id before ‘<’ token|Da müsste man jetzt etwas genauer wissen, wie der Code aussieht, damit man es so richtig stellen kann, wie es gemeint ist. Je nach Zusammenhang kann hier der Fehler verschiedene Ursachen haben. Am wahrscheinlichsten ist, dass vorher eine Forward-Deklaration des Operators
template <class T> bool operator ==(const slice_iter<T>&p, const slice_iter<T>&q);fehlt. Sonst weiß der Compiler nicht, dass der Operator als Template definiert ist und wundert sich, was das <> da soll, wenn er es als normale Funktion zu parsen versucht.
Kann es denn sein, dass hier ein anderer Sprachstandard verwendet wurde?
Jain. Die Fehler sind schon korrekt so, streng nach Sprachstandard. Aber Compiler dürfen auch etwas laxer sein in der Umsetzung der Sprache. Das war besonders ganz früher der Fall, als der Sprachstandard noch jung war oder bei schwer zu implementierenden Feinheiten des Sprachstandards. Dadurch konnte auch an sich fehlerhafter Code problemlos übersetzt werden, ohne dass man die Fehler bemerkte. Aber besonders der GCC ist in den letzten Jahren extrem pedantisch geworden, was die Einhaltung des Sprachstandards angeht. Dann funktioniert der Code mit neuen Compilern eben nicht mehr.
Sollte ich vielleicht einen anderen Compiler nehmen?
Würde ich nicht, außer es bereitet extrem viel Mühe, den Code auf den neuesten Stand zu bringen. Falsch ist er sowieso, falls irgendwann der alte Compiler nicht mehr benutzt werden kann, hast du das gleiche Problem wieder. Außerdem haben jüngere GCCs wirklich viel gelernt, was Optimierung angeht, viele (nahezu alle) Features des C++11-Standard umgesetzt und die Fehlermeldungen sind sehr viel lesbarer geworden. Darauf würde ich(!) nicht verzichten wollen.
Oder doch nach einem Schalter fǘr laxere Fehlerbehandlung suchen
Ja, das könnte gehen. Aber meistens sollte er dir schon den passenden Schalter vorschlagen, wenn es einen gibt. Eventuell kannst du auch die Sprachstandardschalter mal ausprobieren. Die GCC-Standards sind oft laxer als die ANSI-Standards.