Probleme beim re-kompilieren eines existierenden Programms
-
Hallo zusammen,
ich stehe gerade vor dem Problem, ein bereits im Einsatz befindliches Programm meines Vorgängers neu kompilieren zu "dürfen".
Wie so oft, wurde hier leider kein Wert auf Dokumentation, etc. gelegt. Also ist ausprobieren angesagt.
Einige Compiler-Errors habe ich schon eliminieren können. Bei den restlichen stehe ich allerdings auf dem Schlauch.Der aktuelle Compiler-Aufruf lautet wie folgt:
c++ -I/usr/local/include -I/srv/develop/BOAL/boallib_41/create-lib -I/opt/oracle/product/11.2.0/dbhome_1/precomp/public -I/srv/develop/BOAL/mico-2.3.12/include -I/srv/develop/BOAL/mico-2.3.12/include/mico -I/usr/include/c++/4.1.2 -L/usr/local/lib programm44.cpp -o programm44.o
Und das kommt dabei heraus (nur ein Ausschnitt):
/srv/develop/BOAL/mico-2.3.12/include/mico/string.h:49: error: expected ‘;’ before ‘operator’ /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:71: error: declaration of ‘operator[]’ as non-function /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:71: error: expected ‘;’ before ‘(’ token /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:74: error: expected `;' before ‘char’ /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:74: error: ‘ULong’ has not been declared /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:116: error: ‘ULong’ was not declared in this scope /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:118: error: ‘ULong’ has not been declared /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:141: error: expected ‘;’ before ‘operator’ /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:162: error: declaration of ‘operator[]’ as non-function /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:162: error: expected ‘;’ before ‘(’ token /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:165: error: expected `;' before ‘wchar_t’ /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:165: error: ‘ULong’ has not been declared /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:207: error: ‘ULong’ was not declared in this scope /srv/develop/BOAL/mico-2.3.12/include/mico/string.h:209: error: ‘ULong’ has not been declared /usr/include/c++/4.1.2/cstring:80: error: ‘::memcpy’ has not been declared /usr/include/c++/4.1.2/cstring:81: error: ‘::memmove’ has not been declared /usr/include/c++/4.1.2/cstring:82: error: ‘::strcpy’ has not been declared /usr/include/c++/4.1.2/cstring:83: error: ‘::strncpy’ has not been declared [...]
Ich denke mal, es ist recht unwahrscheinlich, dass in den Header-Dateien selbst etwas syntaktisch falsch ist ("expected ‘;’ before ‘operator’").
Obwohl ich der Meinung bin, dass der Compiler-Aufruf alles abdecken sollte, scheint hier doch wohl noch irgendetwas zu fehlen.
Nur im Moment sehe ich den Wald vor lauter Bäumen nicht...Kann mir jemand einen Tipp geben, wie ich dem Fehler am besten auf die Spur komme?
Vielen Dank im voraus!
-
Ich denke, dir fehlen lediglich ein paar Includes. Schau zum Beispiel in Zeile 49 der string.h, welchen Rückgabetyp der Operator hat und binde den entsprechenden Header explizit ein. Oder dir fehlen ein paar
typename
s...
-
Ich hoffe, ich verstehe Dich jetzt richtig.
Zeile 49 sieht z.B. wie folgt aus.
48 // begin-mico-extension 49 Boolean operator== (const String_var &s) const; 50 // end-mico-extension
Ich kann mir nicht vorstellen, dass im Quellcode noch irgendwelche #includes fehlen, da dieses Programm seinerzeit ja bereits erfolgreich in diese Form kompiliert wurde.
Oder meinst Du die Includes beim Compiler-Aufruf?
-
Was ist denn beispielsweise ein Boolean? Ist das wo das definiert wird auch eingebunden?
-
Das ist es ja gerade, das mich verzweifeln lässt.
Ich habe im Moment echt keinen Schimmer, was ich noch wo einbinden könnte.
Hier das Ganze nochmal ganz von Anfang an, wenn das hilft?1 // -*- c++ -*- 2 /* 3 * MICO --- an Open Source CORBA implementation 4 * Copyright (c) 1997-2001 by The Mico Team 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Library General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Library General Public License for more details. 15 * 16 * You should have received a copy of the GNU Library General Public 17 * License along with this library; if not, write to the Free 18 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 19 * 20 * For more information, visit the MICO Home Page at 21 * http://www.mico.org/ 22 */ 23 24 #ifndef __mico_string_h__ 25 #define __mico_string_h__ 26 27 namespace CORBA { 28 29 class String_out; 30 31 class String_var { 32 33 friend class String_out; 34 35 private: 36 char* _str; 37 38 public: 39 String_var (); 40 String_var (char *); 41 String_var (const char *); 42 String_var (const String_var &); 43 ~String_var (); 44 45 String_var &operator= (char *); 46 String_var &operator= (const char *); 47 String_var &operator= (const String_var &); 48 // begin-mico-extension 49 Boolean operator== (const String_var &s) const; 50 // end-mico-extension 51 52 // g++ const overload problem 53 #ifdef HAVE_CONST_OVERLOAD 54 operator const char* () const 55 { 56 return _str; 57 } 58 59 operator char* () 60 { 61 return _str; 62 } 63 64 #else // HAVE_CONST_OVERLOAD 65 operator char* () const 66 { 67 return _str; 68 } 69 #endif // HAVE_CONST_OVERLOAD
-
Boolean ist nicht deklariert. Entweder den entsprechenden Header inkludieren oder ne Vorwärtsdeklaration machen.
-
den entsprechenden Header inkludieren
Genau das ist es ja. Wenn ich es richtig sehe, HABE ich ja alles nötige inkludiert (s.u).
Das Hauptprogramm inkludiert die CORBA.h:
Programm.cpp: #include <iostream> using namespace std; #include <CORBA.h> <- !!! #include <ifroot.h> #include <ifdatabase.h> #include <ifaccountingunitfactory.h> #include <ifaccountingunit.h> [...]
Die CORBA.h inkludiert die mico/string.h aus dem darunter liegenden Verzeichnis 'mico':
/home/develop/BOAL/mico-2.3.12/include/CORBA.h: #include <mico/basic.h> #include <mico/magic.h> #include <mico/address.h> #include <mico/string.h> <- !!! #include <mico/tcconst.h> [...]
Hier der Auschnitt der den ersten Fehler beim kompilieren produziert:
/home/develop/BOAL/mico-2.3.12/include/mico/string.h: public: String_var (); String_var (char *); String_var (const char *); String_var (const String_var &); ~String_var (); String_var &operator= (char *); String_var &operator= (const char *); String_var &operator= (const String_var &); // begin-mico-extension Boolean operator== (const String_var &s) const; <- !!! // end-mico-extension
Der Fehler:
mico/string.h:49: error: expected ‘;’ before ‘operator’
Also sollte doch mit der Compiler-Anweisung
g++ -o Progamm -I/home/develop/BOAL/mico-2.3.12/include Programm.cpp
alles abgedeckt sein, oder nicht?
Wie gesagt: Ich hab' echt keine Ahnung, was hier noch fehlen könnte, bzw. wie ich herausfinden kann, was fehlt?!
-
Hast du mal im Projekt nach ner Definition gesucht (wirklich mit der Textsuchfunktion)? Was inkludieren mico/basic.h, mico/magic.h, mico/address.h und vor allem mico/string.h?