2016-07-11 4 views
1

У меня есть следующий код: PascalFPC Compile в качестве статической библиотеки

Library foo; 

uses 
    ctypes; 

procedure Dummy; cdecl; 
begin 
end; 

exports 
    Dummy; 

begin 
end. 

компилировать его в файл .o, я:

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

Он создает файл foo.o и файл link.res.

Затем я делаю ar -q foo.a foo.o link.res для создания foo.a. Однако, если я ссылаюсь на файл с GCC (ссылка на мою программу на C++), то символ Dummy не найден.

FPC говорит, что это ссылка, совместимая с gcc. Почему я не могу найти символы? Что я делаю не так? Если я не укажу -Cn, он скомпилирует его с .dll, который работает. Однако мне нужна статическая библиотека.

Edit: Он также генерировать этот пакетный файл:

@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 

Двойной щелчок он создает .dll файл, который работает.

+0

Используйте bintools для проверки файла библиотеки foo.a и посмотреть, что он содержит. Вот как вы начинаете отлаживать такие проблемы. В противном случае вы будете работать слепыми. –

+0

Он содержит файл .o и файл .res. – Brandon

+0

А какие символы? –

ответ

0

Я играл немного, и appparently вам нужно объявить его export или нас public name (или публичный псевдоним, если вы хотите как искаженное и нон искаженное символ)

unit xx; 
interface 

uses 
    ctypes; 

procedure Dummy; cdecl;export; 

implementation 
procedure Dummy; cdecl; 

begin 
end; 


begin 
end. 
+0

Это намного лучше, потому что имена не искалечены. Тем не менее, я только выяснил, что не могу создавать статические библиотеки с FPC или Lazarus = { – Brandon

+0

Ну, это очень негативно, но это действительно не предварительный трек, поэтому вам, вероятно, нужно исследовать некоторые вещи, например, как связать + интегрировать RTL , настройте ящик памяти и код запуска крюка. –

+0

Я пробовал это: https://github.com/martok/fpc-static-gcc Нет сигары. Не работает слишком хорошо. – Brandon

Смежные вопросы