2016-07-11 2 views
1

J'ai le code Pascal suivant:CPF Compile comme bibliothèque statique

Library foo; 

uses 
    ctypes; 

procedure Dummy; cdecl; 
begin 
end; 

exports 
    Dummy; 

begin 
end. 

Pour compiler dans un fichier .o, je fais:

ppcrossx64.exe -Cn -CcCDECL -O2 -Xs -XS -Xt foo.pas. Il crée un foo.o et un fichier link.res. Puis, je fais ar -q foo.a foo.o link.res pour créer foo.a. Toutefois, si je lier au fichier avec GCC (lien avec mon programme C++), le symbole Dummy est introuvable. FPC dit que c'est un lien compatible avec gcc. Pourquoi je ne trouve pas les symboles? Qu'est-ce que je fais mal? Si je ne spécifie pas -Cn, il le compile à un .dll qui fonctionne. Cependant, j'ai besoin d'une bibliothèque statique.

Edit: Il génère également ce fichier batch:

@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 

Double clic crée un fichier .dll qui fonctionne.

+0

Utilisez bintools pour inspecter le fichier de bibliothèque foo.a et voyez ce qu'il contient. C'est ainsi que vous commencez à déboguer de tels problèmes. Sinon, vous travaillez aveugle. –

+0

Il contient le fichier .o et le fichier .res. – Brandon

+0

Et quels symboles? –

Répondre

0

J'ai joué un peu, et vous appparently devez déclarer export ou nous public name (ou pseudonyme public si vous voulez à la fois mutilée et symbole non mutilée)

unit xx; 
interface 

uses 
    ctypes; 

procedure Dummy; cdecl;export; 

implementation 
procedure Dummy; cdecl; 

begin 
end; 


begin 
end. 
+0

C'est beaucoup mieux parce que les noms ne sont pas mutilés. Cependant, je viens de découvrir que je ne peux pas construire de librairies statiques avec FPC ou Lazarus = { – Brandon

+0

Eh bien, c'est très négatif, mais ce n'est pas une piste pré-préparée, donc vous avez probablement besoin de rechercher comment lier + intégrer RTL , configurez le gestionnaire de mémoire et le code de démarrage du hook. –

+0

J'ai essayé ceci: https://github.com/martok/fpc-static-gcc Aucun cigare. Ça ne marchait pas très bien. – Brandon