Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Für Linux compilen (https://www.delphipraxis.net/144878-fuer-linux-compilen.html)

RedShakal 18. Dez 2009 17:05


Für Linux compilen
 
Hallo, ich habe ein kleines Client - Server programm programmiert. Dieser verwaltet Accountdaten. Client und Server kommunizieren über Sockets mit einfachen Read- und Writeln befehlen. Die Accountdaten werden vom Client gesendet, der Server gleicht mit den ini Files ab und sendet die entsprechende Antwort.

Heute ist mir ein kleiner VServer für 1€ im Monat in die Hände gefallen. 5gb Festplatte, 64mb Ram, 10gb Traffic. Nichts besonderes aber ideal geeignet für mein kleines Projekt.

Also dachte ich mir:

Das Programm so umschreiben das es lokal auf eine SQL DB Zugreift und somit auf die ini Files verzichtet. ( Leider hab ich keinerlei Ahnung wie das funktioniert mit MySQL ).

Dann bleibt noch die Frage ob Linux die Sockets versteht oder ob ich andere Lösungen finden muss.
Die letzte Frage die sich stellt, ist wie man überhaupt für Linux compiled?
Ich besitze einen SSH zugang und mein Server befindet sich monentan in einer Consolen Anwendung für Windows.

Ich hoffe ihr könnt mir ein bisschen helfen.

implementation 18. Dez 2009 17:39

Re: Für Linux compilen
 
Zitat:

Zitat von RedShakal
..., 64mb Ram, ...

mb? Millibit? Ich bezweifle dass du damit booten kannst... :mrgreen:

generic 18. Dez 2009 17:43

Re: Für Linux compilen
 
Zitat:

Zitat von RedShakal
Die letzte Frage die sich stellt, ist wie man überhaupt für Linux compiled?

Das geht (noch) nicht. Delphi kann keine Linux binaries erstellen.
Damals gab es Kylix, das lief ganz gut.
Demnächst könnte es einen Crosscompiler geben.

Du kannst versuchen "freepascal" zu nutzen.

Namenloser 18. Dez 2009 17:44

Re: Für Linux compilen
 
Zitat:

Zitat von RedShakal
Die letzte Frage die sich stellt, ist wie man überhaupt für Linux compiled?

Mit Delphi gar nicht.

Allerdings kannst du versuchen, dein Projekt nach FreePascal (bzw. Lazarus) zu portieren, womit sich dein Projekt auch für Linux und einige andere Systeme kompilieren lässt. Die Sprache ist nicht identisch zu Delphi, aber ähnlich - wenn du Glück hast, lässt es sich fast ohne Anpassungen kompilieren, wenn du Pech hast, musst du alles neu schreiben.

Phoenix 18. Dez 2009 17:46

Re: Für Linux compilen
 
@implementation:
Bitte, entweder was zum Thema sagen oder nichts posten.

Zitat:

Zitat von RedShakal
Die letzte Frage die sich stellt, ist wie man überhaupt für Linux compiled?

Normales Delphi gar nicht. Es gab da mal sowas was sich Kylix nannte. Damit konnte man dann Delphi-Anwendungen für Linux erstellen. TeamSpeak 1.5 und TeamSpeak 2 wurden damit gemacht - also prinzipiell sollten Sockets funktionieren ;-)
Schau Dir mal Lazarus / Freepascal an. Das geht eher in die Richtung.

Alternativ kannst Du Dir auch mal den kostenlosen Command Line Compiler von Delphi Prism holen. Das benötigt dann lediglich ein installiertes Mono und funktioniert auch mit Datenbanken einwandfrei.

Edith sagt: Zweimal andere schneller und ich hatte keinen roten Kasten.. strange...

implementation 18. Dez 2009 18:01

Re: Für Linux compilen
 
Wenn man die Direktive
Delphi-Quellcode:
{$mode delphi}
benutzt, gibt es sprachlich (fast) keine Unterschiede. Umschreiben musst du den Code nur, wenn du die VCL verwendet hast. Dann musst du auf die FCL-LCL-Legierung umsteigen.

Prototypjack 18. Dez 2009 18:16

Re: Für Linux compilen
 
Zitat:

Zitat von generic
Demnächst könnte es einen Crosscompiler geben.

Wobei aber das "Demnächst" erfahrungsgemäß als sehr relativ einzuschätzen ist ;).

Grüße,
Max

RedShakal 18. Dez 2009 19:29

Re: Für Linux compilen
 
Kann man eigentlich mit einer Konsolen Anwendung einen SQL zugriff realisieren? Vor allem, wenn ich versuche den Code zu Portieren, klappt der Zugriff dann immernoch?

mjustin 19. Dez 2009 09:56

Re: Für Linux compilen
 
Zitat:

Zitat von RedShakal
Kann man eigentlich mit einer Konsolen Anwendung einen SQL zugriff realisieren? Vor allem, wenn ich versuche den Code zu Portieren, klappt der Zugriff dann immernoch?

Natürlich, SQL Clients kann man auch in Konsolenanwendungen ansprechen, auch (sofern der eigene Code portabel ist) auf anderen Betriebssystemen.

Viele Grüße,
Michael

RedShakal 19. Dez 2009 10:46

Re: Für Linux compilen
 
ehrlich gesagt stehe ich jetzt komplett auf dem Schlauch. Über wine klappt das ganze schonmal garnicht. Und wie man einen SQL Zugriff realisiert weiß ich leider auch nicht obwohl ich schon mind. 10 verschiedene Tutorials gelesen habe.

implementation 19. Dez 2009 10:51

Re: Für Linux compilen
 
Wieso benutzt du Wine?
Du kannst das Programm doch einfach nativ für Linux compilieren.
Dann brauchst du Wine gar nicht mehr.

Phoenix 19. Dez 2009 10:57

Re: Für Linux compilen
 
Zitat:

Zitat von implementation
Du kannst das Programm doch einfach nativ für Linux compilieren.

Dann erklär ihm doch mal etwas detaillierter wie er das mit FPC macht ;-)

implementation 19. Dez 2009 11:20

Re: Für Linux compilen
 
Wenn er eine Konsolenanwendung haben will muss er einfach nur die IDE öffnen,
de´n Quelltext laden und eventuell noch den Quelltext so umschreiben, dass er nichts Windows-spezifisches benutzt.
Dann auf das Menü "Run" klicken und je nach Wunsch auf den Menüpunkt "Compile" oder "Run".

RedShakal 19. Dez 2009 17:41

Re: Für Linux compilen
 
Also mein Quellcode sieht aktuell so aus:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils, windows, IdTCPServer, IdContext, IdBaseComponent, IdComponent, ComCtrls;
type
 TServer = class(TObject)
   IdTCPServer1: TIdTCPServer;
   procedure IdTCPServer1Execute(AThread: TIdContext);
   procedure IdTCPServer1Connect(AThread: TIdContext);
 private
   { Private declarations }
   constructor Create;
 public
   { Public declarations }
 end;

 Const
   Version = '0.02';

type
  TDynStringArray = Array of string;

function Explode(const Separator, S :String; Limit :Integer = 0): TDynStringArray;
  var
    SepLen: Integer;
    F, P: PChar;
begin
  SetLength(Result, 0);
  if (S = '') or (Limit < 0) then
    Exit;
  if Separator = '' then
    begin
      SetLength(Result, 1);
      Result[0] := S;
      Exit;
    end;
  SepLen := Length(Separator);

  P := PChar(S);
  while P^ <> #0 do
    begin
      F := P;
      P := AnsiStrPos(P, PChar(Separator));
      if (P = nil) or ((Limit > 0) and (Length(Result) = Limit - 1)) then
        P := StrEnd(F);
      SetLength(Result, Length(Result) + 1);
      SetString(Result[High(Result)], F, P - F);
      F := P;
      if P = Separator then
        SetLength(Result, Length(Result) + 1);
      while (P^ <> #0) and (P - F < SepLen) do
        Inc(P);
    end;
end;


procedure TServer.IdTCPServer1Execute(AThread: TIdContext);
var
  Data   : String;
  StrArr : TDynStringArray;
  LI     :TListItem;
begin
 with AThread.Connection do
 begin
   Data := String(Socket.ReadLn);
   Data := Trim(Data);
   WriteLn(Data);

   if Length(Data) > 0 then
     begin
       StrArr := Explode('|', Data);
         if StrArr[0] = 'login' then
            begin
              if StrArr[3] <> Version then
                begin
                  Socket.WriteLn('version');
                end
              else
                begin
                  if (StrArr[1] = 'test') and (StrArr[2] = '123') then
                    begin
                      Socket.WriteLn('login');
                    end
                else
                  begin
                    Socket.WriteLn('invalid');
                  end;
              end;
            end;
     end;
 end;
end;

procedure TServer.IdTCPServer1Connect(AThread: TIdContext);
begin
  WriteLn('Client verbunden.');
end;

constructor TServer.Create;
begin
 inherited Create;
 WriteLn('#######################');
 WriteLn('##                   ##');
 WriteLn('## Masterserver '+version+' ##');
 WriteLn('##                   ##');
 WriteLn('#######################');
 WriteLn('');
 IdTCPServer1 := TIdTCPServer.Create(nil);
 WriteLn('Server wurde initialisiert.');
 IdTCPServer1.DefaultPort := 5000;
 WriteLn('Server lauscht auf Port: '+InttoStr(IdTCPServer1.DefaultPort));
 IdTCPServer1.TerminateWaitTime := 5000;
 IdTCPServer1.OnConnect := IdTCPServer1Connect;
 IdTCPServer1.OnExecute := IdTCPServer1Execute;
end;

var
 Server : TServer;
begin
 Server := TServer.Create;
 Server.IdTCPServer1.Active := True;
 While True do sleep(10);
end.
Ich hab ihn jetzt mal versucht über ein Linux VMWare mit FPC zu compilen aber irgentwie bin ich anscheiennd zu doof dazu. Wenn ich mit wine emulieren will dann sagt er irgentwas von X-Servern und Grafiktreibern.

An der Stelle wo jetzt if (StrArr[1] = 'test') and (StrArr[2] = '123') then steht versuche ich noch herauszufinden wie ich eine SQL Datenbank benutzen kann was sich leider als weit schwieriger erweißt als erwartet.

implementation 19. Dez 2009 17:57

Re: Für Linux compilen
 
Wo liegt denn das Problem beim FPC? Fehlermeldung?
Welche Version verwendest du? Welches Linux?
Bei ist die FreePascal-IDE /usr/bin/fp
und der Kommandozeilencompiler /usr/bin/fpc
Ich habe Version 2.2.4 auf Debian (lenny)

RedShakal 19. Dez 2009 18:05

Re: Für Linux compilen
 
Project1.dpr(14,4) Warning: Constructor should be public
Project1.dpr(41,8) Error: Illegal type conversion: "ShortString" to "^Char"
Project1.dpr(45,26) Error: Illegal type conversion: "ShortString" to "^Char"
Project1.dpr(114,47) Error: Wrong number of parameters specified for call to "IdTCPServer1Connect"
Project1.dpr(95,19) Hint: Found declaration: TServer.IdTCPServer1Connect(TIdContext);
Project1.dpr(115,47) Error: Wrong number of parameters specified for call to "IdTCPServer1Execute"
Project1.dpr(59,19) Hint: Found declaration: TServer.IdTCPServer1Execute(TIdContext);
Project1.dpr(125) Fatal: There were 4 errors compiling module, stopping

Astat 19. Dez 2009 18:19

Re: Für Linux compilen
 
Hallo RedShakal, siehe folgenden Thread.

http://www.delphipraxis.net/internal...t.php?t=132581

lg. Astat

implementation 19. Dez 2009 18:32

Re: Für Linux compilen
 
Zwei der Meldungen kannst du evtl. lösen, indem du folgende Direktive benutzt:
Delphi-Quellcode:
{$mode delphi}

argonix 19. Dez 2009 18:40

Re: Für Linux compilen
 
Unter FPC werden events durch Adressen verknüpft. Also z.B.
Delphi-Quellcode:
IdTCPServer1.OnConnect := @IdTCPServer1Connect;
IdTCPServer1.OnExecute := @IdTCPServer1Execute;
Außerdem musst du die Indy-Komponenten für Lazarus kompilieren und installieren.
(Bei dem einfachen Programm würde ich das aber mit Synapse oder LNet neu schreiben, das ist wesentlich stressfreier und vor allem schneller.)

implementation 19. Dez 2009 18:57

Re: Für Linux compilen
 
Mit genannter Direktive läuft auch das:
Delphi-Quellcode:
IdTCPServer1.OnConnect := IdTCPServer1Connect;


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz