PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Windows-Quellcode unter Linux kompilieren!?



Rhakaar
09.03.06, 13:41
Hi Leute!

Ich bin hier echt am Verzweifeln. Hoffentlich kann mir irgendeiner von Euch ein wenig (oder besser ganz) helfen.

Zur Zeit bin ich hier gerade bei meiner Diplomarbeit bei und trete wegen meines Problem wirklich auf der Stelle. Im Moment soll ich ein Programm, was unter WinNT gecoded ist, auf Linux portieren. Nun habe ich den Quellecode halt in ein Projekt von KDevelop untergebracht. Wie ich mir es auch schon dachte, läuft es nicht unter Linux. Nach einer Internetrecherche bin ich auf "Wine" gestoßen, mit dem man ausführbare Programme unter Linux zum Laufen bekommt, und unter anderem auch Quellcode, programmiert auf anderen Plattformen (hier z.B. WinNT), unter Linux kompilieren kann. Somit habe ich mir dann gleich mal "Wine" auf Linux installiert.

Nun habe ich schon superviele Einstellungen in zig Varianten unter KDevelop vorgenommen, doch es werden immernoch die Standardbibliotheken für Linux benutzt, um das Programm zu kompilieren. Das der Kompiler dann natürlich meckert, braucht man garnicht zu erwähnen.

Meine Frage ist nun:
Wie bekomme ich den Kompiler dazu, daß genau die Bibliotheken benutzt werden, die ich brauche, um ein Windows-Programm unter Linux zu kompilieren?

Irgendwie gibt es da auch einen "winegcc"-Kompiler, der um ein paar Argumente des normalen "gcc"-Kompilers für die Konsole erweitert wurde.
Muß ich mit dem "winegcc"-Kompiler kompilieren oder geht das auch mit "gcc"? Wenn ja, welche Argumente muß ich dem Kompiler ("gcc" oder "winegcc") zusätzlich liefern? Muß ich vielleicht auch etwas an den Makefiles oder Configfiles ändern? Da habe ich nämlich überhaupt keine Ahnung von.

Vorher habe ich noch nie unter Linux gearbeitet und kenne mich auf Konsolenebene nur auf aller unterstem Niveau aus. Nutzen tue ich SuSE 9.2 und die "wine"-Komponente ist auf 0.9.9 versiert.

Das allgemeine Programmieren unter Linux funktioniert ja einwandfrei, doch nur das jetzige Problem, den WinNT-Quellcode kompatibel zu dem Linux-Kompiler KDevelop zu machen, bereitet mir ernsthafte Sorgen.

Helft mir bitte ... wäre Euch wirklich sehr dankbar!

der_dicke_alex
09.03.06, 14:51
Zur Zeit bin ich hier gerade bei meiner Diplomarbeit bei und trete wegen meines Problem wirklich auf der Stelle. Im Moment soll ich ein Programm, was unter WinNT gecoded ist, auf Linux portieren. Nun habe ich den Quellecode halt in ein Projekt von KDevelop untergebracht. Wie ich mir es auch schon dachte, läuft es nicht unter Linux.
Nach einer Internetrecherche bin ich auf "Wine" gestoßen, mit dem man ausführbare Programme unter Linux zum Laufen bekommt, und unter anderem auch Quellcode, programmiert auf anderen Plattformen (hier z.B. WinNT), unter Linux kompilieren kann. Somit habe ich mir dann gleich mal "Wine" auf Linux installiert.

Du verwurschtelst da alles miteinander. Du kannst mit Wine Windows-Binaries unter Linux laufen lassen. (Wenn du Glück hast :D)
Das heißt aber nicht, daß du Quellcode für Windows Anwendungen unter Linux einfach so kompilieren kannst.


Nun habe ich schon superviele Einstellungen in zig Varianten unter KDevelop vorgenommen, doch es werden immernoch die Standardbibliotheken für Linux benutzt, um das Programm zu kompilieren. Das der Kompiler dann natürlich meckert, braucht man garnicht zu erwähnen.

Wie jetzt? Willst du das Programm jetzt portieren oder versuchst du noch *irgendwie* durch Austauschen der Namen der Headerdateien alles ans Laufen zu bekommen???




Meine Frage ist nun:
Wie bekomme ich den Kompiler dazu, daß genau die Bibliotheken benutzt werden, die ich brauche, um ein Windows-Programm unter Linux zu kompilieren?


????

Hast du dich schon mal mit den Grundzügen von plattformübergreifender Programmierung auseinander gesetzt???



Das allgemeine Programmieren unter Linux funktioniert ja einwandfrei, doch nur das jetzige Problem, den WinNT-Quellcode kompatibel zu dem Linux-Kompiler KDevelop zu machen, bereitet mir ernsthafte Sorgen.


Kdevelop ist eine Entwicklungsumgebung um den Code hübsch zu verwalten. Das hat aber auch *gar nix* mit dem Code selbst zu tun...

Was ist das für eine Anwendung? Reine Windows-API, MFC, XYZ??? Wird spezielle Hardware angesprochen?
Irgendwie musst du schon *gescheite* Infos geben...

Gruß
Alex

sepp2k
09.03.06, 15:07
Du verwurschtelst da alles miteinander. Du kannst mit Wine Windows-Binaries unter Linux laufen lassen. (Wenn du Glück hast :D)
Das heißt aber nicht, daß du Quellcode für Windows Anwendungen unter Linux einfach so kompilieren kannst.

Winelib is a development toolkit which allows you to compile your Windows applications on Unix.

1234567890

stefan-tiger
09.03.06, 15:10
1. Benutz nicht KDevelop am Anfang, denn so kannst du nicht unterscheide ob der "Fehler" von KDevelop ist oder von was anderem
2. Das Programm läßt sich nur leicht portieren, wenn es nur Funktionen nutzt die in der Standardbibliothek vorhanden sind, bzw. die selbe Bibliotheken auch unter Linux vorhanden sind. Ansonsten heisst es: die betreffenden Funktionen selbst neu implementieren.

Soweit ich weiß musst du auch das Hauptprogramm ändern, weil es unter Windows nicht main() ist.

Ganz Simpel ausgedrückt: wenn es eine grafische Oberfläche hat die nicht mit GTK oder Qt erstellt wurde wirst du diesen Teil nicht portieren können sondern musst ihn selber neu machen.

Gruß

traffic
09.03.06, 18:25
Schau Dir am besten mal eine der hier verlinkten Anwendungen als Vorlage an:

http://winehq.org/site/winelib

PS: Du musst zusätzlich zum Paket "wine" mindestens auch noch "wine-devel" installieren, weil da die Windows-kompatiblen Header drin sind. Im Paket "wine" sind nur die Bibliotheken. Und dann natürlich die eigentliche Arbeit: Die meisten portierten winelib-Anwendunen scheinen das GNU-Buildsystem zu benutzen, d.h. Du wirst Dir autoconf, automake und Konsorten anschauen wollen.

Rhakaar
10.03.06, 10:39
Vielen Dank für Eure Beiträge.

Ich werde versuchen, Eure Fragen ausreichend zu beantworten. ;)

@der_dicke_alex




Nun habe ich schon superviele Einstellungen in zig Varianten unter KDevelop vorgenommen, doch es werden immernoch die Standardbibliotheken für Linux benutzt, um das Programm zu kompilieren. Das der Kompiler dann natürlich meckert, braucht man garnicht zu erwähnen.

Wie jetzt? Willst du das Programm jetzt portieren oder versuchst du noch *irgendwie* durch Austauschen der Namen der Headerdateien alles ans Laufen zu bekommen???

Also durch alleinigen Austausch der Headerdateien werde ich sicherlich nicht viel erreichen. Oder liege da vielleicht falsch?
Eigentlich müßte ich dem Compiler doch mitteilen können, daß er nicht die Header aus "/usr/include/g++/" verwendet, sondern die aus "wine". Und das sollten doch eigentlich die aus "/usr/include/wine/msvcrt/" und "/usr/include/wine/msvcrt/sys/" sein.
Meine sogenannten Einstellungen waren die Versuche, daß der Compiler das eben genannte macht. Bislang greift er ja immer auf die Header von "/usr/include/g++/" zu.
Zum Test habe ich mal explizit einen Header von "/usr/include/wine/msvcrt/" in das Programm eingebunden. Nur dann kommt eine Meldung, daß diverse Methoden und Typen doppelt deklariert wurden. Das müßte ja nun eigentlich ein Hinweis darauf sein, daß von vorn herein die Header aus "/usr/include/g++/" eingelesen werden.
Aus anderen Quellen habe ich gelesen, daß man statt der Standardbibliothek andere Bibliotheken einbinden kann, indem man dem Linker folgendes mitteilt:

-nostdlib -L/Pfad/der/Libs/ -leigeneLib
Das hat mir aber leider auch nicht weitergeholfen
Bin ich nun vielleicht auf einer völlig falschen Fährte, wenn ich denke, daß "wine" eine andere Bibliothek benutzt, als die Standardbibliothek? Oder werden nur andere Header benutzt? Die Standardbibliothek ist doch die "stdlib.c", oder ist es "glibc.c"? :confused:





Meine Frage ist nun:
Wie bekomme ich den Kompiler dazu, daß genau die Bibliotheken benutzt werden, die ich brauche, um ein Windows-Programm unter Linux zu kompilieren?

????

Hast du dich schon mal mit den Grundzügen von plattformübergreifender Programmierung auseinander gesetzt???

Welche Grundzüge meinst Du denn überhaupt genau? Und worauf möchtest Du hinaus? Nicht daß wir aneinander vorbeidenken. ;)





Das allgemeine Programmieren unter Linux funktioniert ja einwandfrei, doch nur das jetzige Problem, den WinNT-Quellcode kompatibel zu dem Linux-Kompiler KDevelop zu machen, bereitet mir ernsthafte Sorgen.

Kdevelop ist eine Entwicklungsumgebung um den Code hübsch zu verwalten. Das hat aber auch *gar nix* mit dem Code selbst zu tun...

Stimmt, da habe ich mich falsch ausgedrückt.
KDevelop benutzt für C++ doch standardmäßig den Compiler "gcc". Was für eine Rolle spielt denn bei "wine" der "winegcc"? Muß ich diesen Kompiler benutzen, um Windows-Quellcode unter Linux kompilieren zu können?



Was ist das für eine Anwendung? Reine Windows-API, MFC, XYZ??? Wird spezielle Hardware angesprochen?
Irgendwie musst du schon *gescheite* Infos geben...

Das Programm benutzt nur die Windows API. Es gibt keine grafischen Oberflächen und nutzt nur selbstgeschriebene Klassen, die alle nur die Standard-Header benutzen - also eigentlich nichts Kompliziertes.



@stefan-tiger


1. Benutz nicht KDevelop am Anfang, denn so kannst du nicht unterscheide ob der "Fehler" von KDevelop ist oder von was anderem

Ist KDevelop kein so toller Developer? Was würdest Du denn empfehlen?



2. Das Programm läßt sich nur leicht portieren, wenn es nur Funktionen nutzt die in der Standardbibliothek vorhanden sind, bzw. die selbe Bibliotheken auch unter Linux vorhanden sind. Ansonsten heisst es: die betreffenden Funktionen selbst neu implementieren.

Es werden nur Standard-Header benutzt. Keine grafischen Elemente. Siehe meiner letzten Stellungnahme zu "der_dicke_alex".



Soweit ich weiß musst du auch das Hauptprogramm ändern, weil es unter Windows nicht main() ist.

Das Programm (Modul) wird in der Funktion "main()" benutzt. Von daher sollte es kein Problem sein. Oder meintest Du damit etwas anderes?



@traffic


PS: Du musst zusätzlich zum Paket "wine" mindestens auch noch "wine-devel" installieren, weil da die Windows-kompatiblen Header drin sind. Im Paket "wine" sind nur die Bibliotheken. Und dann natürlich die eigentliche Arbeit: Die meisten portierten winelib-Anwendunen scheinen das GNU-Buildsystem zu benutzen, d.h. Du wirst Dir autoconf, automake und Konsorten anschauen wollen.

Genau die Header habe ich schon gesucht, wie ein Wilder. Das Paket habe ich mir ersteinmal besorgt und nun habe ich sie auch.
Welche "winelib"-Anwendungen benötige ich denn? So etwas wie "winemaker"?
Mit "autoconf, automake und Konsorten" kenne ich mich noch nicht die Bohne aus, werde aber wohl nicht drumherum kommen, mich dort einzulesen, wenn es denn die Situation fordert.


Schöne Grüße aus dem hohen Norden

oracle2025
10.03.06, 11:34
Ich würde folgendes Vorgehen empfehlen:

genaues Durchlesen des Winelib User's Guide (http://www.winehq.org/site/docs/winelib-guide/index).

Erstellen eines einfachen "Hello World" Programms mit Windows-API.

Dann das Hello World Programm compilieren (ohne KDevelop, nur Kommandozeile)

Wenn das funktioniert, mit dem richtigen Programm anfangen.

hp_tux
10.03.06, 16:19
Hallo,

ähm, also, ich bin wahrhaftig kein Experte auf diesem Gebiet, aber ich kann es mir beim besten Willen nicht vorstellen, daß man sowas wie "WINE" braucht, um ein Windows-Programm auf Linux zu portieren. "Portieren" heißt AFAIK, daß das Programm nachher nativ unter Linux laufen soll - oder etwa nicht?

Gruß

hp_tux

noise_
10.03.06, 16:38
also es funktionierst sicher. wir haben das in der schule gemacht. programm mit win-libs geschrieben dann über cygwin (denk ich) gcc aufgerufen und kompiliert.
(es war ein einfaches programm für kommunikation über die serielle schnittstelle)

corax2.05
10.03.06, 16:39
hab auch nicht gerade den plan bei solchen dingen, aber wenn man mit winegcc ein windowsprogramm kompiliert dann kommt am ende doch wieder ein windowsprogramm raus!?

hp_tux
10.03.06, 16:56
Hallo,


also es funktionierst sicher. wir haben das in der schule gemacht. programm mit win-libs geschrieben dann über cygwin (denk ich) gcc aufgerufen und kompiliert.
nun, auch wenn das so funktioniert, bedeutet das wohl nicht, daß das Programm damit auf Linux portiert wurde.

Gruß

hp_tux

traffic
10.03.06, 18:09
[...] ich kann es mir beim besten Willen nicht vorstellen, daß man sowas wie "WINE" braucht, um ein Windows-Programm auf Linux zu portieren.
Doch, kann man wunderbar brauchen. Es sei denn, man möchte sein Projekt im Rahmen der "Portierung" mehr oder weniger neu schreiben.

"Portieren" heißt AFAIK, daß das Programm nachher nativ unter Linux laufen soll - oder etwa nicht?
Tut es auch. Durch die Portierung mittels winelib wird aus der ehemaligen Windows-EXE ein normales ELF-Binary, das gegen die libwine.so.1 gelinkt ist und im Gegensatz zur Windows-EXE auch auf anderen CPUs als x86ern laufen kann.

Dieser Portierungsweg entspricht ziemlich genau dem, was man auch in umgekehrter Richtung mit cygwin bzw. der cygwin1.dll machen kann, wenn man Linux/Unix/Posix-Programme auf Windows portiert.

wir haben das in der schule gemacht. programm mit win-libs geschrieben dann über cygwin (denk ich) gcc aufgerufen und kompiliert.
Nein, das ist etwas völlig anderes. Das war dann einfach ein normales Windows-Programm, das zur Abwechslung nicht mit MSVC, sondern mit dem GCC kompiliert wurde - mehr nicht.

[...] wenn man mit winegcc ein windowsprogramm kompiliert dann kommt am ende doch wieder ein windowsprogramm raus!?
Nein. winegcc ist ein Wrapper für den normalen GCC, mit dem man einfacher als mit dem normalen GCC WINE-Header unter Linux einbinden und gegen die libwine.so.1 linken kann. Der Witz an der Sache ist, dass man damit Kommandozeilen bzw. Makefile-Kompatibilität zu MinGW hat.

Was Du meinst, wäre ein Cross-Build. Sowas kann man auch machen, hat aber mit WINE bzw. winelib nichts zu tun.

WhiteShadow
10.03.06, 18:40
also von Programmierung hab ich nur absolute Grundkenntnisse, aber von Wine bisl Ahnung.

Wine ist geeignet Windows API unter Linux laufen zu lassen (Wine ist noch Beta, also geht sicher nicht alles, aber vieles).
WineLib ist dazu da um Windows-API nicht auszuführen, sondern zu übersetzen.
(hat schon jemand gesagt)

Ansonsten scheint mir was "oracle2025" geschrieben hat sinnvoll, auch KDevelop erstmal außen vor zu lassen klingt gut, so kann man Fehler und Missverständnisse vermeiden.

Hast du mal versucht das Programm unter Windows zu kompilieren, dann mit Wine unter Linux laufen zu lassen? Wenn das geht, 'sollte' auch die Portierung möglich sein.

hp_tux
10.03.06, 19:16
Hallo,

danke, traffic - wieder was gelernt. :-)

Gruß

hp_tux

Rhakaar
20.03.06, 10:39
Danke für Eure Hilfe.
Die Arbeit mit "wine" habe ich aber vorerst auf Eis gelegt, da hier kein nennenswertes Ergebnis bei herausgekommen ist und ein Programmierer hier in der Firma sagte, daß es mit "wine" garnicht so unkompliziert zu lösen sei.

Naja, nun stapfe ich hier durch den Code-Schlamm und versuche ihn zum Laufen zu kriegen. Bin auch relativ erfolgreich bei der Sache, doch stoße ich jetzt auf einen Fehler, der erstens massenhaft auftritt und zweitens für mich absolut unverständlich und nicht nachvollziehbar ist.
Der Fehler lautet "error: template with c linkage" und markiert mir diverse Templates im Code.

Ich habe mal nach diesem Fehler ge"google"t, doch nicht so richtig Hilfreiches gefunden. Hat einer von Euch vielleicht schon Erfahrungen mit dieser Art von Fehlermeldung gemacht und wie ist dagegen vorgegangen worden? Es soll anscheinend mit Inkompatibilitäten des C99 Standards zu tun haben.

Benutze gcc Version 3.3.4 unter SuSE Linux 9.2

Rhakaar
22.03.06, 14:08
Fehler haben sich erledigt! ;)