Kompilierung bei Turbo C++, wenn die Dateien in mehreren Ordnern liegen



  • Ich habe ein Projekt, wo die Dateien folgendermaßen abgelegt sind:

    PROJECT
    |
    +--FUNCS
    |  |
    |  +--FUNCS.CPP
    |  |
    |  +--FUNCS.H
    |
    +--COMPILE.BAT
    |
    +--MAIN.CPP
    

    Die Headerdatei wird nun so eingebunden:
    In der MAIN.CPP: #include "funcs/funcs.h"
    In der FUNCS.CPP: #include "funcs.h"

    Wenn ich mich jetzt auf der Kommandozeile im Ordner PROJECT befinde und in Turbo C++ 3.0 kompiliere:

    tcc -eprogram *.cpp funcs\*.cpp
    

    kommt folgende Fehlermeldung:

    Error funcs\funcs.cpp 1: Unable to open include file 'funcs.h'

    Was kann ich dagegen tun? Was muss ich aufrufen, damit die Kompilierung funktioniert?



  • Borland? 😉 ist schon ein paar Tage her.
    Schau mal in der IDE unter Optionen -> Verzeichnisse und editiere das, wenn es über die IDE geändert werden soll.

    Andere Variante:
    Unter DOS -> autoexec.bat -> path passend ändern
    Unter Windows -> Umgebung editieren.

    Für eine einmalige Aktion vorm arbeiten am Projekt, eine Batch-Datei mit den entsprechenden PATH-Ergänzungen starten. Aber solche Aktionen gehören heute schon fast zu verlorenem Wissen.

    So das wären schon 3 Varianten 😉

    MfG f.-th.



  • Variante 4:

    #include <func\myheader.h>

    könnte auch noch eine Möglichkeit sein.

    MfG f.-th.



  • Nein, das würde alles nichts bringen. Es geht darum, dass der Compiler nicht vom Standort der Quellcodedatei ausgeht, wenn es darum geht, einen Header einzubinden, sondern von dem Standort, an dem ich mich auf der Kommandozeile befinde.

    Wenn ich also im Ordner PROJECT bin und von dort tcc FUNCS\FUNCS.CPP kompiliere, dann liest er die Codezeile #include "funcs.h" und sagt sich nicht: "O.k., funcs.h liegt im selben Ordner wie funcs.cpp", sondern er sagt sich: "funcs.h hat keine Pfadangabe, soll also im selben Ordner liegen, in dem ich gerade stehe. Mein Ordner ist PROJECT, und hier liegt keine funcs.h. Also gebe ich einen Fehler aus". Würde ich folgendes machen:

    cd FUNCS
    tcc FUNCS.cpp
    

    würde es funktionieren.
    War das so weit verständlich? Bei relativen Pfadangaben in #include-Anweisungen geht er nicht von dem Pfad aus, an dem die Datei, die das #include aufruft, liegt, sondern er geht von der aktuellen Position auf der Kommandozeile aus.



  • Es kann sein das das mit dem relativen Path system- oder compilerspezifisch war.

    Was spricht gegen absolute Pfade bei den Headern?

    Hier mal so eine Batch:

    SET PATH=C:\Myprojekt\Myheader;%PATH%
    
    C:\Borland\bin\bcc
    

    musst du halt für dein Projekt passend schreiben.

    Bei DOS war aber die PATH-Länge limitiert. Musst halt sehen ob du noch schnell Infos dazu findest. Wie lang der Pfad unter welchem Windows sein darf? Im Zweifel testen. Auch die Verschachtelungstiefe war begrenzt und einige Sachen, die man heute mit den Verzeichnis und Dateinamen einsetzt, sollten unter Turbo C auch noch nicht gehen.

    Unter Turbo C++ 3.0 Grenzen bei Pfad oder Dateinamen ohne Gewähr:
    Länge etwa 250 Zeichen???
    Verschachtelung 7 Ebenen
    Dateinamen 8+3
    keine Leerzeichen

    MfG f.-th.



  • f.-th. schrieb:

    Was spricht gegen absolute Pfade bei den Headern?

    Meinst du Header im Quellcode sollen absolut angegeben werden? (Wenn ja: Das ist jetzt nicht dein Ernst, oder?) Aus folgendem werde ich nämlich nicht schlau:

    f.-th. schrieb:

    Hier mal so eine Batch:

    SET PATH=C:\Myprojekt\Myheader;%PATH%
    
    C:\Borland\bin\bcc
    

    musst du halt für dein Projekt passend schreiben.

    Was bitteschön nützt es mir, den Ordner mit den Headern in die Path-Variable zu schreiben?



  • Das mit den Headerdateien in der IDE anpassen möchtest du nicht?

    MfG f.-th.



  • Was meinst du mit Headerdateien in der IDE anpassen? Meinst du, ich soll die Includepfade in Turbo C++ anpassen oder meinst du, ich soll die #include -Anweisungen im Quellcode anpassen?

    Wenn du meinst, ich soll die Includepfade in Turbo C++ anpassen: Das wäre ja nur für Header, die man mit include <...> einbindet. Hier geht es aber darum, dass die Header relativ zu Quellcodedateien liegen ( include "..." ) und der Compiler nicht im Pfad der einbindenden Datei nachsieht, sondern in dem Pfad, in dem der Benutzer gerade ist. Das heißt, wenn ich in der Datei "C:\MYPRGS\TESTPRG\TEST.CPP" die Zeile include "test.h" habe und nun vom Desktop aus auf der Kommandozeile folgendes mache:

    C:\Dokumente und Einstellungen\Hans Wurst\Desktop>tcc C:\myprgs\testprg\test.cpp
    

    dann beschwert er sich, dass die Includeanweisung falsch ist, weil er auf dem Desktop(!) keine "test.h" findet.
    Folgendes würde beides gehen:

    C:\MYPRGS\TESTPRG>tcc C:\myprgs\testprg\test.cpp
    
    C:\MYPRGS\TESTPRG>tcc test.cpp
    

    Und das finde ich eben etwas komisch. Wieso sucht er nach Headerdateien relativ vom eigenen Standort statt relativ vom Standort der Datei? Ich müsste also in jeden Ordner einzeln gehen und die Dateien kompilieren, um dann nachher erneut alle OBJ-Dateien zusammenzusammeln und zu verlinken. (Ob das gegenseitige Einbinden von Headern, die wiederum in komplett unterschiedlichen Ordnern liegen, funktioniert, kann ich im Moment nicht mal sagen.) Bei anderen Compilern ist das nicht so:

    C:\Dokumente und Einstellungen\Hans Wurst\Desktop>gcc C:\myprgs\test.cpp
    

    funktioniert.
    P.S.: Das hat auch erstmal gar nichts mit der IDE zu tun, sondern mein Problem ist mit dem Compiler auf der Kommandozeile.

    Wenn du meinst, ich soll die Includeanweisungen in den Codes selber ändern: Das möchte ich nicht so gerne machen, weil das ja wieder bei anderen Compilern Probleme geben würde oder wenn ich absolute Pfade verwende, kann ich den Code nicht mehr verschieben.


Log in to reply