Fico muito feliz pelas respostas essa comunidade é muito boa. Eu não sou um programador profissional, apenas é um hobby que eu tenho. Então o que eu to fazendo não é nada importante.
Eu consigo criar uma DLL e usar no Freepascal e até conseguir realizar o inline em código c com sucesso. Seguindo esse tutorial
ftp://ftp.freepascal.org/fpc/docs-pdf/CinFreePascal.pdf Eu fiz uma DLL simples no Freepascal para ser usado na linguagem Dlang exemplo
// referência https://www.freepascal.org/docs-html/prog/progse55.html
//arquivo subs.pas
library subs;
procedure SubStr(); cdecl;
begin
write('hello World');
end;
exports
SubStr;
end.
// referência https://dlang.org/articles/dll-linux.html
//arquivo Gethello.d
import core.stdc.stdio;
import core.stdc.stdlib;
import core.sys.posix.dlfcn;
extern (C) int SubStr();
int main()
{
printf("+main()\n");
void* lh = dlopen("libsubs.so", RTLD_LAZY);
if (!lh)
{
fprintf(stderr, "dlopen error: %s\n", dlerror());
exit(1);
}
printf("libsubs.so is loaded\n");
int function() fn = cast(int function())dlsym(lh, "SubStr");
char* error = dlerror();
if (error)
{
fprintf(stderr, "dlsym error: %s\n", error);
exit(1);
}
printf("dll() function is found\n");
fn();
printf("unloading libsubs.so\n");
dlclose(lh);
printf("-main()\n");
return 0;
}
comandos para compilar
fpc subs.pas
dmd Gethello.d
dmd Gethello.o -defaultlib=libphobos2.so -L-rpath=/home/affonso/Desktop/lab7
Esse exemplo acima funciona perfeitamente, porém quando eu tento fazer o inverso de criar uma DLL em Dlang e importar a DLL no código FPC ele compila o programa roda só que a função não aparece o valor. Exemplo
//referência https://dlang.org/articles/dll-linux.html
//arquivo dll.d
import core.stdc.stdio;
extern (C) int dll(int b)
{
int a = 10;
int c = a * b;
return c;
}
//referência https://www.freepascal.org/docs-html/prog/progse56.html
// arquivo teste.pas
program teste;
uses dynlibs;
type
TSubStrFunc = function(a: Integer) :Integer; cdecl; external;
const
baselibname = 'libdll.';
{$ifdef windows}
libext = 'dll';
{$else}
{$ifdef macos}
libext = 'dylib';
{$else}
libext = 'so';
{$endif}
{$endif}
var
lib: TLibHandle;
dll: TSubStrFunc;
a: Integer;
begin a:=10;
lib:=LoadLibrary('libdll.so');
Pointer(dll):=GetProcAddress(lib,'dll');
writeLn(dll(a));
unloadLibrary(lib);
end.
Comandos para compilar
dmd -c dll.d -fPIC
dmd -oflibdll.so dll.o -shared -defaultlib=libphobos2.so -L-rpath=/home/affonso/Desktop/lab7
fpc teste.pas
O que há de errado com o programa teste.pas que não imprime a função da DLL como descrito na linha writeLn(dll(a));????
Desculpa pelo texto enorme mas eu queria descrever com o máximo de detalhe.
respondendo as perguntas acima meu inglês é péssimo e tenho que estudar isso. E eu queria algo como Library Shared. Em modo static eu até consigo fazer e por isso eu tô tentando no modo Library Shared.