g++ mit "Vor-Compiler"
-
Vorweg muss ich vielleicht sagen, dass ich von Programmieren unter Linux und dem g++-Compiler nicht so viel Ahnung habe, darum entschuldigt bitte, wenn
ich ein paar Sachen durcheinander bringen sollte.Nun zu meiner Frage:
Der Ausgangspunkt ist, dass ich einen Compiler habe, der Code von einer selbstentwickelten Programmiersprache (nicht von mir
) in C++ übersetzt. Dieses läuft auch wunderbar in VC++ 6 unter Windows (d.h. ist eingebunden über Libraries, Includes und was es dort sonst noch alles gibt). Nun habe ich die schöne Aufgabe das ganze mit Hilfe des g++ Compilers auf Linux zu übertragen, d.h. es soll wieder der "Vor-Compiler" laufen der "unbekannten" in C++-Code übersetzt, und dann wieder ein "ganz normales" .exe-Programm erstellt. Nun weiß ich aber nicht wie ich das anstellen soll!? Geht das über makefiles oder mit Hilfe der IDE kDevelop oder doch ganz anders? Ein makefile für ein bestimmtes Projekt von VC++ (und natürlich auch ein VC++-Projektfile) habe ich und kann ich wenn es hilft schicken.
Ich hoffe ihr habt das Problem verstanden, und wenn noch weitere Infos gewünscht sind, einfach fragen...gruß
c++-beginner
-
Hallo,
schau dir mal den Aufbau vom GCC an, bei google findest du das offizielle Wiki.
Was du vorhast (wenn ich dich richtig verstehe) ist möglich.
Du müsstest "nur" ein Frontend schreiben, welches den C++ Code in den
Zwischencode vom GCC umwandelt. Aus diesem macht dir der Compiler dann
eine (optimierte) Binary.Wie das geht schaust du dir im GCC Wiki an, und wenn du Lust hast,
schreibst du dann noch hier wie du es gemacht hast, das würde mich auch
interessierenGrüße,
HeadhunterEdit:
Ich sehe du hast schon C++ Code? Wo ist dann das Problem?
Mh...
-
Man sollte aber nicht verschwigen, dass es auch einfacher geht. Wenn du automake und co. verwendest und ein paar einschränkungen vertragen kannst, kann ich dir helfen. Hatte ein ähnliches problem.
-
C++-Beginner schrieb:
Der Ausgangspunkt ist, dass ich einen Compiler habe, der Code von einer selbstentwickelten Programmiersprache (nicht von mir
) in C++ übersetzt. [...]Geht das über makefiles
Jep. Ich mach mal ein übervereinfachtes Beispiel.
prog: prog.cpp g++ -o prog prog.cpp prog.cpp: prog.foo foocompiler prog.foo
D.h. du stellst das als Abhängigkeitskette dar. Wenn sich prog.foo ändert, muss prog.cpp neu generiert werden. Wenn sich prog.cpp ändert, muss es neu (zu prog) compiliert werden. Du kommst jetzt aber natürlich nicht umhin, dir make anzugucken.
-
Zunächst einmal VIELEN DANK für eure schnellen Antworten! Ich werde mir mal eure verschiedenen Möglichkeiten angucken und ausprobieren. Ich werde aber sicherlich noch eure Hilfe brauchen
!
schönen gruß
C++-Beginner
-
Hallo zusammen,
ich habe jetzt fast das ganze Wochenende mit make herumprobiert aber irgendwie ist da nichts anständiges bei herausgekommen. Ich habe jetzt mal den Makefile aus Visual C++ exportiert (also einen nmake-File). Aber mit diesem kann man ja unter Linux nicht viel anfangen! Wenn jemand Lust hat, kann ich Ihm den Makefile per Mail schicken und er kann mal in den Makefile reinschauen um mir eventuell bei der Erstellung eines Makefile für Linux zu helfen.
Ich denke sehr viel von diesem nmake-Makefile der aus VC++ 6 exportiert wurde
ist sowieso "unnützt"...Ich würde mich sehr über Hilfe freuen
schönen gruß
c++-beginner
-
probier mal, ob mein makefile bei dir geht.
#für mingw #CXXFLAGS:=$(CXXFLAGS) -mthreads CXXFLAGS:=$(CXXFLAGS) -Wall -Werror -pipe -fno-rtti #CXXFLAGS:=$(CXXFLAGS) -g CXXFLAGS:=$(CXXFLAGS) -O3 -s -DNDEBUG -fomit-frame-pointer -ffast-math -fno-enforce-eh-specs CXXFLAGS:=$(CXXFLAGS) -fmerge-all-constants cpp=$(wildcard *.cpp) obj=$(addprefix .outMakefile/,$(cpp:.cpp=.o)) dep=$(obj:.o=.d) project:=$(basename $(notdir $(CURDIR))) targetExt:= ifeq ($(OS),Windows_NT) targetExt:=.exe libs:=-lws2_32 endif target:=.outMakefile/$(project)$(targetExt) default: $(target) ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),zip) -include $(dep) endif endif .PHONY: clean run zip $(target): $(obj) $(CXX) $(CXXFLAGS) -o $(target) $(obj) $(libs) .outMakefile/%.o .out/%.d: %.cpp .outMakefile/keep makefile $(CXX) $(CXXFLAGS) -c -o .outMakefile/$*.o -MD $< .outMakefile/keep: mkdir .outMakefile echo keep > .outMakefile/keep clean_makefile: $(RM) -r .outMakefile $(target) run: $(target) ./$(target) zip: cd .. && tar -c $(project)/styleguide.txt $(project)/os $(project)/compiler $(project)/*.cpp $(project)/*.hpp $(project)/makefile | bzip2 -c > $(project)/$(project).tar.bz2
mach ein verzeichnis, zum beispiel test und mach da das makefile rein und zwei oder drei cpp-dateien. sie müssen die erweiterung .cpp haben. und starte mal make. falls das zufällig klappt, dann können wir das bestimmt ganz schnell deinen wünschen anpassen. ich hab nämlich ähnliche wünsche.
-
Hallo volkard,
ich habe jetzt mal dein Makefile ausprobiert, es hat aber leider nicht geklappt (Fehlermeldung: Makefile:31: *** missing separator. Stop). Müssen die cpp-Dateien einen "bestimmten Inhalt" haben?
Es kann aber auch daran liegen, dass ich es mit "Cygwin" ausprobiert habe. Ich werde es gleich heute abend mal unter Linux testen.Wenn Du nichts dagegen hast, dann schicke ich Dir mein aus VC++ 6 exportierten Makefile mal per Mail zu (kannst ja mal einen Blick reinwerfen
)!?
gruß
c++-beginner
-
C++-Beginner schrieb:
(Fehlermeldung: Makefile:31: *** missing separator. Stop).
Dieser Fehler deutet zu 99,9% darauf hin, dass du vor den jeweiligen Befehlen kein Tabulatorzeichen (Ascii 9) gesetzt hast, sondern nur eine Anzahl Leerzeichen.
Syntax:
ziel : abhängigkeiten ... <TAB>befehl
-
Bashar schrieb:
Dieser Fehler deutet zu 99,9% darauf hin, dass du vor den jeweiligen Befehlen kein Tabulatorzeichen (Ascii 9) gesetzt hast, sondern nur eine Anzahl Leerzeichen.
jup. das forum hier macht aus tabs leerzeichen.
@Beginner: auf sauge http://volkard.de/makefile das ist mit tabs.
-
Hat geklappt!
Aber da kommt gleich die nächste Fehlermeldung, ich weiß aber nicht ob das am Makefile oder an den cpp-Dateien liegt:
make: *** No rule to make target '.outMakefile/test1.o' needed by 'outMakefile/test.exe'. Stop.
gruß
c++-beginner
-
Hallo zusammen,
ich habe jetzt nochmal den Makefile unter Linux ausprobiert, aber irgendwie kommt da eine etwas längere Fehlermeldung (die kann ich heute abend hier posten).
ich habe Dir jetzt mal eine Mail geschrieben...
gruß
c++-beginner
-
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