2016-07-11 11 views
1

Ich habe folgenden Pascal Code:FPC Compile als Static Library

Library foo; 

uses 
    ctypes; 

procedure Dummy; cdecl; 
begin 
end; 

exports 
    Dummy; 

begin 
end. 

Um es auf eine .o-Datei zu kompilieren, ich mache:

ppcrossx64.exe -Cn -CcCDECL -O2 -Xs -XS -Xt foo.pas.

Es erstellt eine foo.o und eine link.res Datei.

Dann mache ich ar -q foo.a foo.o link.res, um zu erstellen. Wenn ich jedoch mit der Datei mit GCC verlinke (Verknüpfung mit meinem C++ - Programm), Dummy Symbol nicht gefunden.

FPC sagt, dass es Link-kompatibel mit Gcc ist. Warum kann ich die Symbole nicht finden? Was mache ich falsch? Wenn ich -Cn nicht spezifiziere, kompiliert es es zu einem .dll, der funktioniert. Ich brauche jedoch eine statische Bibliothek.

Edit: Es ist auch diese Batchdatei zu erzeugen:

@echo off 
SET THEFILE=C:\Users\Brandon\Desktop\foo.dll 
echo Linking %THEFILE% 
ld.exe -b pei-x86-64 --gc-sections -s --dll --entry _DLLMainCRTStartup --base-file base.$$$ -o C:\Users\Brandon\Desktop\foo.dll link.res 
if errorlevel 1 goto linkend 
dlltool.exe -S as.exe -D C:\Users\Brandon\Desktop\foo.dll -e exp.$$$ --base-file base.$$$ 
if errorlevel 1 goto linkend 
ld.exe -b pei-x86-64 -s --dll --entry _DLLMainCRTStartup -o C:\Users\Brandon\Desktop\foo.dll link.res exp.$$$ 
if errorlevel 1 goto linkend 
goto end 
:asmend 
echo An error occured while assembling %THEFILE% 
goto end 
:linkend 
echo An error occured while linking %THEFILE% 
:end 

Doppelklick auf sie erstellt eine .dll Datei, die funktioniert.

+0

Verwenden bintools die Bibliotheksdatei foo.a inspizieren und sehen, was es enthält. So fangen Sie an, solche Probleme zu debuggen. Ansonsten arbeitest du blind. –

+0

Es enthält die O-Datei und die RES-Datei. – Brandon

+0

Und welche Symbole? –

Antwort

0

spielte ich ein wenig, und appparently Sie es export oder uns zu erklären, müssen public name (oder öffentliche alias wenn Sie wollen beide verstümmelt und nicht verstümmelt Symbol)

unit xx; 
interface 

uses 
    ctypes; 

procedure Dummy; cdecl;export; 

implementation 
procedure Dummy; cdecl; 

begin 
end; 


begin 
end. 
+0

Das ist viel besser, weil die Namen nicht verstümmelt sind. Ich habe jedoch gerade herausgefunden, dass ich keine statischen Bibliotheken mit FPC oder Lazarus erstellen kann. { – Brandon

+0

Nun, das ist sehr negativ, aber es ist in der Tat kein vorbereiteter Track, also musst du wahrscheinlich einige Dinge erforschen, wie RTL verlinken und integrieren , richten Sie den Speichermanager ein und starten Sie den Startcode. –

+0

Ich habe das versucht: https://github.com/martok/fpc-static-gcc Keine Zigarre. Hat nicht so gut funktioniert. – Brandon

Verwandte Themen