Progamm lässt sich auf anderem/zweitem Rechner nicht übersetzen?!



  • Hallo zusammen,

    ich habe da folgendes Problem:

    Ich habe auf einem Rechner (Linux und Eclipse) ein C++-Programm geschrieben, welches sich einwandfrei übersetzen und ausführen lässt.
    Nun habe ich versucht, den Quellcode auf einem anderen(!) Rechner (ebenfalls Linux und Eclipse) zu übersetzen.
    Aber das dort installierte Eclipse, bzw. der Compiler spuckt mir nun massig Fehler der folgenden Art aus:

    make all
    Building file: ../src/iopg.cpp
    Invoking: GCC C++ Compiler
    g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/iopg.d" -MT"src/iopg.d" -o"src/iopg.o" "../src/iopg.cpp"
    ../src/iopg.cpp: In function »void createAndReadConfig(configdata&)«:
    ../src/iopg.cpp:61: Fehler: »getenv« wurde in diesem Gültigkeitsbereich nicht definiert
    ../src/iopg.cpp:65: Fehler: »strcpy« wurde in diesem Gültigkeitsbereich nicht definiert
    ../src/iopg.cpp: In function »fileTimestamps getFileTimestamps(char*)«:
    ../src/iopg.cpp:169: Fehler: »strcpy« wurde in diesem Gültigkeitsbereich nicht definiert
    ../src/iopg.cpp:176: Fehler: »strerror« wurde in diesem Gültigkeitsbereich nicht definiert
    ../src/iopg.cpp:177: Fehler: »exit« wurde in diesem Gültigkeitsbereich nicht definiert
    ../src/iopg.cpp: In function »int main(int, char**)«:
    ../src/iopg.cpp:239: Fehler: »strcpy« wurde in diesem Gültigkeitsbereich nicht definiert
    ../src/iopg.cpp:250: Fehler: »strlen« wurde in diesem Gültigkeitsbereich nicht definiert

    usw.

    Hier die inkludierten Header-Files:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <errno.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <sys/stat.h>
    #include <time.h>
    using namespace std;
      [...]
    

    Und hier ein Code-Ausschnitt, auf den sich die o.g. Fehlermeldungen beziehen:

    user = getenv("USER");		// Fehler "Zeile 61"
    	homedir = getenv("HOME");
    	editor = getenv("EDITOR");
    
    	strcpy(svnviConfigDir, ".svnvi");	// Fehler "Zeile 65"
    	strcpy(svnviConfig, "svnvi.conf");
    	strcpy(svnBackupDir, "svnbackup");
            [...]
    	strcpy(filename, param_filename);	// Fehler "Zeile 169"
    usw.
    

    Es liegt hier also scheinbar kein programmiertechnisches Problem vor.
    Viel mehr scheint mir wohl auf dem Rechner "was zu fehlen".
    Meines Erachtens sind aber alle notwendigen Header-Files und Libraries installiert?!
    Oder seh' ich den Wald nur vor lauter Bäumen nicht?

    Hat jemand 'nen Tipp, woran es liegen könnte?

    Vielen Dank im schon mal voraus!

    Gruß,
    /Th.



  • kannst du das ganze mal auf nen minimales (aber kompilierbares bsp.) herunterbrechen? und dann hier noch mal posten?!
    dann hast du evtl. größere chancen...

    bb



  • Da hast du wohl zwei verschiedene Linuxe/GCC-Versionen. Der erste Rechner übersetzt dein Programm, weil zufällig die von dir benutzten Funktionen über einen anderen Header deklariert werden. Für getenv müsstest du stdlib.h, für strcpy string.h inkludieren. Für strcpy solltest du sogar cstring inkludieren und std::strcpy benutzen. Bei getenv bin ich mir nicht sicher, aber cstdlib existiert auch und bei mir gibt es ein std::getenv.

    Wenn du die man-Pages installiert hast, kannst du die C-Header auch mit "man getenv" usw. suchen.

    Lars



  • Klar, ich hab' das jetz mal sehr(!) stark runtergebrochen.
    Die Fehler an den jeweiligen Stellen treten aber weiterhin auf:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <errno.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <sys/stat.h>
    #include <time.h>
    using namespace std;
    
    // Struktur zum auslesen der Konfigurationsdatei:
    struct configdata
    {
    	string conf_username;
    	string conf_homedir;
    	string conf_editor;
    	string conf_svndirectory;
    };
    
    // Konfiguration pruefen und ggf. neu anlegen:
    void createAndReadConfig(configdata &config)
    {
    	char svnviConfig[11];
    	char svnviConfigDir[7];
    	char svnBackupDir[10];
    
    	char *user;
    	char *homedir;
    	char *editor;
    
    	// Umgebungsvariablen:
    	user = getenv("USER");
    	homedir = getenv("HOME");
    	editor = getenv("EDITOR");
    
    	strcpy(svnviConfigDir, ".svnvi");
    	strcpy(svnviConfig, "svnvi.conf");
    	strcpy(svnBackupDir, "svnbackup");
    
    	return ts_return;	// In diesem Beispiel nur der Vollstaendigkeit halber angegeben. ts_return wird vorher natuerlich noch definiert.
    }
    
    int main(int argc, char *argv[])
    {
    	// Config erstellen, bzw. vorhandene Daten in Form einer Struktur holen:
    	struct configdata config;
    	createAndReadConfig(config);
    
    	char *confEditor;
    	confEditor = new char[config.conf_editor.size()+1];
    	strcpy(confEditor, config.conf_editor.c_str());
    }
    

    Was mich halt nur wundert ist, daß das Programm sich auf einem anderen Rechner einwandfrei übersetzen lässt...

    /Th.



  • http://www.cplusplus.com/reference/clibrary/cstdlib/getenv/

    Du hast nicht alle includes. Auf dem andere Rechner hat der Compiler wohl vermutet und includiert.



  • Warum sowas:

    void createAndReadConfig(configdata &config)
    {
        ....
    
        return ts_return;    // Wenn hier ein Rückgabewert kommen soll, muss es vorn ein -> int createAnd... sein
    
    }
    

    Warum der Mix aus C und C++ Headern? Vor allem, wenn Strings unter so einem Mix stehen, handelt man sich oft Probleme ein.



  • Der C++-Standard definiert nicht, welche Header jeweils von anderen Headern eingebunden werden. Also brauchen die Deklarationen nicht in anderen Headern zu sein und der Compiler muss nix vermuten, sondern die von dir inkludierten Header haben auf dem ersten System einfach ein paar Includes, die nicht zwingend vom Standard vorgeschrieben werden und im zweiten System fehlen.

    Die Lösung wurde schon mehrmals genannt: Binde alle Header ein, die du brauchst.



  • manni66 schrieb:

    Da hast du wohl zwei verschiedene Linuxe/GCC-Versionen. Der erste Rechner übersetzt dein Programm, weil zufällig die von dir benutzten Funktionen über einen anderen Header deklariert werden. Für getenv müsstest du stdlib.h, für strcpy string.h inkludieren. Für strcpy solltest du sogar cstring inkludieren und std::strcpy benutzen. Bei getenv bin ich mir nicht sicher, aber cstdlib existiert auch und bei mir gibt es ein std::getenv.

    Wenn du die man-Pages installiert hast, kannst du die C-Header auch mit "man getenv" usw. suchen.

    Lars

    Hi!

    Es sind in der Tat unterschiedliche Linuxe (über die Compiler-Version kann ich im Moment aber nichts sagen).
    Nachdem ich nun testweise mal die stdlib.h und die string.h inkludiert habe, lässt sich das Programm problemlos kompilieren.
    Leider aber auch NUR das...
    Starte ich das Programm, erhalte ich nun eine Fehlermeldung bezügl. ' memory corruption':

    *** glibc detected *** ./iopg: malloc(): memory corruption: 0x08dc64e8 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb7e17376]
    /lib/tls/i686/cmov/libc.so.6(__libc_malloc+0x95)[0xb7e18ac5]
    /usr/lib/libstdc++.so.6(_Znwj+0x27)[0xb7ff8f47]
    /usr/lib/libstdc++.so.6(_Znaj+0x1d)[0xb7ff908d]
    ./iopg[0x804a5b2]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7dbb775]
    ./iopg[0x8049501]
    ======= Memory map: ========
    08048000-0804c000 r-xp 00000000 08:06 1925775    /home/thomas/workspace/iopg/Debug/iopg
    0804c000-0804d000 r--p 00003000 08:06 1925775    /home/thomas/workspace/iopg/Debug/iopg
    0804d000-0804e000 rw-p 00004000 08:06 1925775    /home/thomas/workspace/iopg/Debug/iopg
    08dc6000-08de7000 rw-p 08dc6000 00:00 0          [heap]
    b7c00000-b7c21000 rw-p b7c00000 00:00 0
    b7c21000-b7d00000 ---p b7c21000 00:00 0
    b7da4000-b7da5000 rw-p b7da4000 00:00 0
    b7da5000-b7f01000 r-xp 00000000 08:05 1246148    /lib/tls/i686/cmov/libc-2.9.so
    b7f01000-b7f02000 ---p 0015c000 08:05 1246148    /lib/tls/i686/cmov/libc-2.9.so
    b7f02000-b7f04000 r--p 0015c000 08:05 1246148    /lib/tls/i686/cmov/libc-2.9.so
    b7f04000-b7f05000 rw-p 0015e000 08:05 1246148    /lib/tls/i686/cmov/libc-2.9.so
    b7f05000-b7f08000 rw-p b7f05000 00:00 0
    b7f08000-b7f15000 r-xp 00000000 08:05 1228865    /lib/libgcc_s.so.1
    b7f15000-b7f16000 r--p 0000c000 08:05 1228865    /lib/libgcc_s.so.1
    b7f16000-b7f17000 rw-p 0000d000 08:05 1228865    /lib/libgcc_s.so.1
    b7f17000-b7f18000 rw-p b7f17000 00:00 0
    b7f18000-b7f3c000 r-xp 00000000 08:05 1246156    /lib/tls/i686/cmov/libm-2.9.so
    b7f3c000-b7f3d000 r--p 00023000 08:05 1246156    /lib/tls/i686/cmov/libm-2.9.so
    b7f3d000-b7f3e000 rw-p 00024000 08:05 1246156    /lib/tls/i686/cmov/libm-2.9.so
    b7f3e000-b8022000 r-xp 00000000 08:05 1665469    /usr/lib/libstdc++.so.6.0.10
    b8022000-b8026000 r--p 000e3000 08:05 1665469    /usr/lib/libstdc++.so.6.0.10
    b8026000-b8027000 rw-p 000e7000 08:05 1665469    /usr/lib/libstdc++.so.6.0.10
    b8027000-b802d000 rw-p b8027000 00:00 0
    b8044000-b8047000 rw-p b8044000 00:00 0
    b8047000-b8048000 r-xp b8047000 00:00 0          [vdso]
    b8048000-b8064000 r-xp 00000000 08:05 1228843    /lib/ld-2.9.so
    b8064000-b8065000 r--p 0001b000 08:05 1228843    /lib/ld-2.9.so
    b8065000-b8066000 rw-p 0001c000 08:05 1228843    /lib/ld-2.9.so
    bfc50000-bfc65000 rw-p bffeb000 00:00 0          [stack]
    Aborted
    

    Den ganzen Code hier zu posten wäre etwas viel.
    Kann mir vielleicht jemand einen Tipp geben, wie ich herausfinde, auf welchen Teil des Codes sich dieser Fehler bezieht?

    Nach Möglichkeit versuche ich ja, C++-Header/-Funktionen zu nutzen.
    Beim googlen nach entsprechenden Beispielen finde ich aber meistens Lösungen, die C- statt C++-Header voraussetzen.
    Gibt es vielleicht eine Übersicht/Gegenüberstellung, an der ich erkennen kann, welche C++-Funktion das Gegenstück zur C-Funktion ist?

    Zu guter Letzt noch kurz die Frage, in welchen Packages sich die Manpages der einzelnen Header/Funktionen unter Ubuntu befinden könnten?
    Schätze mal, es muss irgend etwas mit "dev/devel/header/man" im Namen sein.
    Leider spuckt mir ein "apt-cache search" trotz aller Versuche das ganze einzugrenzen immer noch viel zu viel aus, sodass ich echt keine Ahnung habe, was ich installieren sollte... 😕

    Danke!
    /Th.



  • ich hoffe, du nimmst die C++ - Header ;o)
    (cstring und cstdlib)

    Kann mir vielleicht jemand einen Tipp geben, wie ich herausfinde, auf welchen Teil des Codes sich dieser Fehler bezieht?

    naja - code auskommentieren und debug-ausgaben.
    dann kannst du das prob. zumindest eingrenzen.

    bb



  • unskilled schrieb:

    ich hoffe, du nimmst die C++ - Header ;o)
    (cstring und cstdlib)

    Will das nochmal unterstreichen. Lass string.h und stdlib.h weg und nimm <cstring> und <cstdlib>!

    Kann mir vielleicht jemand einen Tipp geben, wie ich herausfinde, auf welchen Teil des Codes sich dieser Fehler bezieht?

    naja - code auskommentieren und debug-ausgaben.
    dann kannst du das prob. zumindest eingrenzen.

    Es sollte doch auch auf Linux/Unix einen entsprechenden Debugger geben der mir beim Durchlauf anzeigt an welcher Stelle so ein Fehler aufgetaucht ist oder?



  • pumuckl schrieb:

    Es sollte doch auch auf Linux/Unix einen entsprechenden Debugger geben der mir beim Durchlauf anzeigt an welcher Stelle so ein Fehler aufgetaucht ist oder?

    Klar, der schimpft sich gdb, und zahlreiche IDEs wie qtcreator, kdevelop und (denke auch) codeblocks integrieren grafische Frontends dazu.



  • Danke erst mal an alle!
    Ich denke, ich werde mich jetzt mal näher mit dem gdb beschäftigen... 😉

    Gruß,
    /Th.


Anmelden zum Antworten