Linkerfehler bei External Definition

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.

Linkerfehler bei External Definition

Beitragvon HelmuthOL » 22. Sep 2017, 21:16 Linkerfehler bei External Definition

Die Kompilierung eines einfachen Programms funktioniert nicht, wenn eine External-Anweisung vorhanden ist, Linker-Fehler 1 beim Linken. Gleicher Code ohne External funktioniert. Fehler tritt auf mit Lazarus 1.6.4 bei 64-Bit-Version. Mit Version 1.6.0 bei 32-Bit-Version. Bei Windows-Version kein Fehler. Was mache ich falsch? Hier der simple Code:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;
type
  TForm1 = class(TForm)
  private
    { private declarations }
  public
    { public declarations }
  end;
var
  Form1: TForm1;
implementation
 
Function Test(wert : Integer) : Integer; external 'MyTestLib';
 
{$R *.lfm}
end.
Zuletzt geändert von m.fuchs am 22. Sep 2017, 21:45, insgesamt 1-mal geändert.
Grund: Highlighter gesetzt
HelmuthOL
 
Beiträge: 10
Registriert: 22. Sep 2017, 15:26

Beitragvon af0815 » 22. Sep 2017, 22:37 Re: Linkerfehler bei External Definition

Gibt es die dll oder so wirklich ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
af0815
 
Beiträge: 3799
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon HelmuthOL » 23. Sep 2017, 14:09 Re: Linkerfehler bei External Definition

Der Fehler tritt auf wenn es sie gibt und auch wenn es sie nicht gibt.
HelmuthOL
 
Beiträge: 10
Registriert: 22. Sep 2017, 15:26

Beitragvon wp_xyz » 23. Sep 2017, 14:33 Re: Linkerfehler bei External Definition

Ich weiß nicht, wo die {$R Direktive stehen muss, aber bei mir steht sie immer gleich nach "implementation", höchstens noch nach "uses", aber nie nach "ernsthaften" Deklarationen.

Ansonsten solltest du einfach ein einfaches Beispielprojekt zusammenstellen und zusammen mit der DLL hier hochladen, evtl auch mit dem Code der DLL. (Du bist neu hier: Nur Dateien, die nicht vom Compiler erzeugt werden, in ein ZIP zusammenbinden und unter "Dateianhang hochladen". Auch die DLL ins ZIP mit aufnehmen. Einfach alles, was man braucht, um das Projekt kompilieren zu können, aber auch nicht mehr. Und das Projekt so einfach wie möglich gestalten, so dass der Fehler auftritt. Niemand hat hier Lust, sich in seiner Freizeit durch ein fremdes Projekt zu wühlen).
wp_xyz
 
Beiträge: 3006
Registriert: 8. Apr 2011, 08:01

Beitragvon HelmuthOL » 23. Sep 2017, 14:56 Re: Linkerfehler bei External Definition

Der fall ist ohne Aufwand zu erzeugen:
- Lazarus starten
- Datei klicken
- Neu klicken
- Anwendung wählen
- In der erzeugten Unit1 die Zeile mit der external Anweisung aus der Fehlermeldung einfügen.
Da der Fehler auftritt, egal ob die Library existiert oder nicht, erübrigt sich das hochladen eines Projekt.
Die {$R Direktive wird bei obiger Vorgehensweise automatisch eingefügt, da habe ich nix geändert.
HelmuthOL
 
Beiträge: 10
Registriert: 22. Sep 2017, 15:26

Beitragvon m.fuchs » 23. Sep 2017, 15:23 Re: Linkerfehler bei External Definition

HelmuthOL hat geschrieben:Da der Fehler auftritt, egal ob die Library existiert oder nicht, erübrigt sich das hochladen eines Projekt.


Wenn die Datei fehlt MUSS der Fehler auftreten. Wenn wir herauskriegen sollen warum er auftritt wenn sie da ist, brauchen wir die Datei.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
Lazarusforum e. V.
 
Beiträge: 2142
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (Lazarus 2.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon Mathias » 23. Sep 2017, 15:36 Re: Linkerfehler bei External Definition

Die Kompilierung eines einfachen Programms funktioniert nicht, wenn eine External-Anweisung vorhanden ist, Linker-Fehler 1 beim Linken.


Folgender Code wird bei mir ohne Fehler unter Linux.
Code: Alles auswählen
  function Test(wert : Integer): Integer; external 'libdl';

Aber sobald ich etwas anderes anstelle von "libdl" schreibe, also etwas das es nicht gibt, bekomme ich den gleichen Fehler wie du.

Bei Windows-Version kein Fehler.

Verstehe ich es richtig, du hast mit Linux probiert ?
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4351
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon wp_xyz » 23. Sep 2017, 15:52 Re: Linkerfehler bei External Definition

Welches Betriebssystem? Unter Windows 10/64Bit kann ich den Fehler nicht reproduzieren (Laz 1.6.4/fpc3.02/64 bit, Laz 1.4.4/fpc2.6.4/32bit, Laz-trunk/fpc3.02/32bit, Laz 1.8RC4/fpc 3.04/32 bit) Was sind deine Compiler-Einstellungen? (Projekt-Optionen > Einstellungen anzeigen).

Wobei mich schon wundert, warum es bei einer nicht-existierenden DLL keinen Fehler gibt...
wp_xyz
 
Beiträge: 3006
Registriert: 8. Apr 2011, 08:01

Beitragvon Socke » 23. Sep 2017, 18:22 Re: Linkerfehler bei External Definition

wp_xyz hat geschrieben:Wobei mich schon wundert, warum es bei einer nicht-existierenden DLL keinen Fehler gibt...

Unter Linux wird ein Minimal-Linker statisch in das Programm hineingelinkt, der die jeweilige Bibliothek dynamisch laden kann.
Windows hat sowas nicht und linkt die Bibliotheken erst zur Ausführung in das Programm hinein.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Socke
Lazarusforum e. V.
 
Beiträge: 2636
Registriert: 22. Jul 2008, 18:27
Wohnort: Köln
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE | 
CPU-Target: 32bit x86 armhf
Nach oben

Beitragvon HelmuthOL » 23. Sep 2017, 18:33 Re: Linkerfehler bei External Definition

Ich habe jetzt beim Googlen gefunden, dass die Library zur Compilierzeit vorhanden sein muss, und zwar im Verzeichnis /usr/lib oder /lib. Beides versucht, kein Erfolg. (Bei Windows braucht sie beim Compilieren nicht vorhanden sein).
HelmuthOL
 
Beiträge: 10
Registriert: 22. Sep 2017, 15:26

Beitragvon Mathias » 23. Sep 2017, 18:49 Re: Linkerfehler bei External Definition

Ich habe jetzt beim Googlen gefunden, dass die Library zur Compilierzeit vorhanden sein muss

Dies wollte ich eigentlich sagen, da bei mir 'libdl' vorhanden war, kompilierte das Programm ohne Fehler.

Unter Linux wird ein Minimal-Linker statisch in das Programm hineingelinkt, der die jeweilige Bibliothek dynamisch laden kann.

Das merkt man gut, wen man die Package OpenGLControl in Lazarus installieren will, fehlt da eine lib welche fur OpenGL gebraucht wird, bricht Lazarus beim kompilieren ab.

Übrigens gibt es 2 Methoden um lib einzubinden, ein statische und eine dynamische.
Bei der dynamische Variante, hat man den Vorteil, das die App nicht schon beim starten abricht, wen die lib nicht vorhanden ist.
Ob die dynamische Variante auch unter Linux funktioniert, habe ich nie probiert. Man müsste dazu mal die Unit 'dynlib' genauer angucken.

Statisch:
Code: Alles auswählen
function QAPIExtOpenCard(cardnum:Longint;devnum:Longint): Longint; stdcall; external 'qlib32.dll'


Dynamisch:
Code: Alles auswählen
uses
  Windows;   // evtl. dynlibs
var
  LibHandle:THandle;
  QAPIExtOpenCard:function (cardnum:Longint;devnum:Longint): Longint; stdcall;
 
begin
  LibHandle := LoadLibrary(PChar('qlib32.dll'));
  Pointer(QAPIExtOpenCard):=GetProcAddress(LibHandle, 'QAPIExtOpenCard');
....
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4351
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon kupferstecher » 24. Sep 2017, 10:40 Re: Linkerfehler bei External Definition

HelmuthOL hat geschrieben:
Code: Alles auswählen
 
Function Test(wert : Integer) : Integer; external 'MyTestLib';
 

Stimmt der Name denn? Groß-/Kleinschreibung ist entscheidend. Evtl. wird der Name beim kompilieren der DLL auch abgeändert ("name-mangeling"). Der Kompiler selbst prüft nicht, ob die externe Funktion überhaupt vorhanden ist, erst der Linker gibt den Fehler aus, wenn er den Namen nicht zuordnen kann.
kupferstecher
 
Beiträge: 232
Registriert: 17. Nov 2016, 11:52

Beitragvon HelmuthOL » 25. Sep 2017, 22:07 Re: Linkerfehler bei External Definition

Ja, Namen richtig geschrieben. Ich habe das jetzt mit der 32-Bit Version von Lazarus probiert. Da kommen ganz andere Fehler. Ich habe es jetzt aufgegeben mit Libraries zu arbeiten. Ich gebe jetzt die .PPU und .o Files mit. Ich habe jetzt Stunden verplempert. Es geht ja auch so.
HelmuthOL
 
Beiträge: 10
Registriert: 22. Sep 2017, 15:26

Beitragvon m.fuchs » 25. Sep 2017, 23:25 Re: Linkerfehler bei External Definition

Tja, schade dass du dich beharrlich weigerst all Projektdateien für Lib und Programm zu zeigen. Sonst hätte man vielleicht weiterforschen können.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de
m.fuchs
Lazarusforum e. V.
 
Beiträge: 2142
Registriert: 22. Sep 2006, 18:32
Wohnort: Berlin
OS, Lazarus, FPC: Winux (Lazarus 2.0, FPC 3.0.4) | 
CPU-Target: x86, x64, arm
Nach oben

Beitragvon marcov » 26. Sep 2017, 21:01 Re: Linkerfehler bei External Definition

Ein paar Tipps:

  • füge .dll Extension hinzu (alsp ganze DLL Namen). Auf Windows benötigen DLLs nicht da zu sein um zu linken (ohne loadlibrary), auf Linux müssen .so schon da sein, aber deshalb kann Windows solche Details nicht raten!
  • calling convention? Keine nimmt register an!
  • füge "name" Klausel zu, COFF hat ja standart ein _ Präfix.
  • deshalb sehe dich auch der DLL an mit zg PE-Explorer oder so, ist das Symbol definiert wie du es erwartest ?
  • EXE selber bittyness als DLL?

also

Code: Alles auswählen
Function Test(wert : Integer) : Integer; stdcall; external 'MyTestLib.dll' name 'Test';
marcov
 
Beiträge: 1058
Registriert: 5. Aug 2008, 08:37
Wohnort: Eindhoven (Niederlande)
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk) | 
CPU-Target: 32/64,PPC(+64), ARM
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Lazarus - Bugs



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried