g++ mit "Vor-Compiler"
-
So ich habe jetzt endlich einen Teilerfolg errungen!
Das übersetzen von der "selbstdefinierten" Sprache in eine .cpp-Datei klappt jetzt mit Hilfe eines Makefiles. Wenn ich jetzt aber den Makefile von volkard mit der neu erzeugten .cpp-Datei nehme sagt er bei 2 Header-Dateien: "No such file or directory". Ich meine aber das ich diese über "INCLUDE" eingebunden habe. Hier ist mal ein Ausschnit aus dem Makefile, vielleicht könnt Ihr mir ja sagen, was da falsch ist:
TARGET :=./test.exe ... ... INCLUDE :="C:/test1/ "C:/test2/" "C:/test3/" all: $(TARGET) $(TARGET): test.obj $(CXX) -g -o $(TARGET) test.obj $(LDFLAGS) $(INCLUDE) test.obj: test.cpp $(CXX) $(CXXFLAGS) -c $< $(INCLUDE) test.cpp: test.foo foocompiler test.foo .PHONY: clean clean: rm -f $(TARGET) rm -f *.cpp rm -f *.obj
schöne grüße
c++-beginner
-
INCLUDE :="C:/test1/ "C:/test2/" "C:/test3/"
$(CXX) -g -o $(TARGET) test.obj $(LDFLAGS) $(INCLUDE)
ist falsch. was soll das (CXX) -g -o $(TARGET) test.obj $(LDFLAGS) $(INCLUDE)
aber hab keine ahnung, ob die option wirklich -I heißt.
-
INCLUDE := test1 test2 test3 RINCLUDE := $(addprefix -I,$(INCLUDE))
Sollte gehen. Ich würde dir ein automatisches buildsystem ala autoconig/automake & co. empfehlen. Das größte problem was du hast ist, dass du sowohl den weg .foo -> .cpp -> .o als auch den Weg .cpp -> .o hast. Wenn du nun eine suffixregel ala %.cpp: %.foo definierst, hast du das problem, dass er für jede .cpp eine .foo sucht. Das lässt sich IMHO umgehen, indem du für jede tatsächliche .cpp eine leeres target einfügst. Ich glaube, gcc hat eine option, die das macht. Vielleicht könnte deine makfile in etwa so aussehen:
%.cpp: %.foo vorkompiler $< -o $@ SRC := foo.cpp bar.cpp test.foo all: deps obj deps: echo "" > .deps eval $(foreach file,$SRC,"gcc -MM -MF .deps $file;echo "$file:\n" >> .deps;") # ... include .deps
Is jetzt natürlich net gekapselt. Außerdem hab ichs net getestet, muss jetzt schluss machen. Wie gesagt, ein automatisches buildsystem könnte einiges vereinfachen (ist aber umständlicher aufzusetzen)
-
Die Header-Dateien werden jetzt dank eurer Hilfe gefunden!
Das größte problem was du hast ist, dass du sowohl den weg .foo -> .cpp -> .o als auch den Weg .cpp -> .o hast. Wenn du nun eine suffixregel ala %.cpp: %.foo definierst, hast du das problem, dass er für jede .cpp eine .foo sucht.
Bisher ist es aber so, das ich nur eine .foo-Datei zu einer .cpp-Datei kompiliere, und das klappt auch. Nur die Erstellung einer .obj-Datei bereitet mir jetzt noch Probleme. Und zwar gibt er Fehler wie:
In file included from c:/testf.h:4, from c:/testm.h:7, from test.cpp:1: C:/testTT.h: At global scope: C:/testPP.h:7: warning: `class TError' has virtual functions but non-virtual destructor C:/testWW.h:25: warning: `class TErrorFatal' has virtual functions but non-virtual destructor .... In file included from C:/jgtest.h:509, from E:/testthread.h:5, from test.cpp:1: C:/ipTest.h: At global scope: C:/ipTest.h:80: warning: `typename IpcQueue<T>::MyQueueType' is implicitly a typename C:/iptest.h:80: warning: implicit typename is deprecated, please see the documentation for details ....
und noch viele weitere ähnliche Fehler...
Aber die Header-Dateien sind auf jedenfall fehlerfrei (es klappt ja unter VC++ auch). Irgendwie passt da was mit der Einbindung den Header-Dateien noch nicht. Diese Header-Dateien müssen ja eigentlich bei der .obj-Datei-Erzeugung angegeben werden... oder sehe ich das irgenwie falsch? Und wie mache ich das genau?gruß
c++-beginner
-
Generierst du header (.h/.hpp) oder implementationsdateien (*.cpp)?
Aber sag mal, hast du mal Versucht, die unter MSVC generierten dateien mit dem gcc/g++ zu compilieren? Nur dass der MSVC sie akzeptiert heißt nicht, dass sie auch richtig sind...
-
Am Besten beschreibe ich es nochmal genau (oben ist es glaube ich ein bißchen verwirrend beschrieben
) :
Die cpp-Datei wird mit Hilfe des "foo-Compilers" einwandfrei erstellt (d.h. die cpp-Datei wenn ich sie mit g++ erstelle, hat genau den gleichen Inhalt wie die cpp-Datei wenn ich sie mit Hilfe des "foo-Compilers" unter VC++ 6 erstelle). Also bis dahin funktioniert alles problemlos.
Jetzt sollen aber die cpp-Dateien mit Hilfe von Header-Dateien (in VC++ 6 sind diese als "Externe Abhängigkeiten" angegeben) zu einer obj-Datei "zusammengeführt" werden. Aber genau das klappt nicht (d.h. die obj-Datei wird nicht erstellt, und die vielen Fehlermeldungen wie oben beschrieben kommen). VC++ 6 benutzt noch eine "Abhängigkeits"-Datei (dep-Datei), wo genau die unter "Externe Abhängigkeiten" aufgeführten Header-Dateien drin stehen. Wie kann ich denn so eine dep-Datei mit Hilfe von make einbeziehen?
Komisch ist nur das die Fehlermeldungen sich genau auf diese Header-Dateien beziehen, d.h. er muss diese Header-Dateien ja schon gefunden haben, sonst würden die Fehlermeldungen bzgl. der Header-Dateien ja nicht kommen.
In VC++ 6 sind noch ein paar "Verweise" auf Libraries angegeben die ich bisher noch nicht berücksichtigt habe, kann es damit etwas zu tun haben? Ich dachte immer, dass die Libraries erst für die Erstellung der exe-Datei benötigt werden?!schöne grüße
c++-beginner
-
_Eben_, darauf will ich ja hinaus. Ich denke, die Dateien werden korrekt erstellt, das ganze ist nur nicht standardkonform, oder so.
-
Also Du meinst, das Sie nur von VC++ 6 akzeptiert werden aber nicht vom g++-Compiler? Das wäre aber...
Ich hoffe aber immernoch das es nur ein Problem mit den einbinden in den Makefile zu tun hat, ich werde also noch ein bißchen weiter probieren.@ness ich habe Dir übrigens schon vor ein paar Tagen den exportierten Makefile aus VC++ 6 per Mail geschickt
schöne grüße
c++-beginner
-
Sorry, da stand noch eine von mir nicht mehr gepflegte addy. Hab aber nix bekommen (glaube auch nicht, dass ich was damit anfangen könnte.) Wenn ich du wäre, würde ich mal ein kleines stück per hand bauen und gucken obs klappt.
-
Ich werde noch mal ein bißchen herumexperementieren...
Wenn ich du wäre, würde ich mal ein kleines stück per hand bauen und gucken obs klappt.
Das werde ich mal ausprobieren, mal schauen ob das klappt?!
schöne grüße
c++-beginner