Forum > Portuguese

como usar uma dll escrito em c

<< < (2/2)

trev:
Bibliotecas dinâmicas também são conhecidas como bibliotecas compartilhadas dinâmicas, objetos compartilhados ou bibliotecas vinculadas dinamicamente.
Bibliotecas estáticas também são conhecidas como bibliotecas de arquivo estático e bibliotecas compartilhadas vinculadas estáticas.

Dynamic Library Example.

Gustavo 'Gus' Carreno:
Oies Trev,


--- Quote from: trev on April 10, 2021, 01:57:45 pm ---Bibliotecas dinâmicas também são conhecidas como bibliotecas compartilhadas dinâmicas, objetos compartilhados ou bibliotecas vinculadas dinamicamente.
Bibliotecas estáticas também são conhecidas como bibliotecas de arquivo estático e bibliotecas compartilhadas vinculadas estáticas.

--- End quote ---

É deveras desconcertante saber que és Australiano e que me estás a corrigir na minha língua nativa, LOL!!
No entanto tenho de admitir que por preguiça não fui à procure da tradução para Português de "shared" e "static".
Mas agora que abordas o assunto, lembro-me que no meu tempo se dizia: livraria/biblioteca partilhada "shared" ou livraria/biblioteca estática "static"
Não tinha-mos tanta propensão a essa verbosidade :)


--- Quote from: trev on April 10, 2021, 01:57:45 pm ---Dynamic Library Example.

--- End quote ---

Bom exemplo da parte do Lazarus. Falta a parte de C ?
Mas no entanto este é um fórum sobre Lazarus, né? :)

Grande abraço,
Gus

trev:

--- Quote from: Gustavo 'Gus' Carreno on April 10, 2021, 02:17:02 pm ---Bom exemplo da parte do Lazarus. Falta a parte de C ?

--- End quote ---

Não - {$linklib C} = Biblioteca C dinâmica do macOS fornecida pelo sistema operacional.

Meu português é cortesia do Google translate :)

Gustavo 'Gus' Carreno:
Hey Trev,


--- Quote from: trev on April 10, 2021, 02:25:41 pm ---Não - {$linklib C} = Biblioteca C dinâmica do macOS fornecida pelo sistema operacional.

--- End quote ---

Estás correto em dizer que linkaste com uma biblioteca que existe.
Mas no primeiro exemplo, o estático, forneceste código em C para a biblioteca.
Neste exemplo, o dinâmico, não forneceste código em C. Capiche, mio amore?


--- Quote from: trev on April 10, 2021, 02:25:41 pm ---Meu português é cortesia do Google translate :)

--- End quote ---

DUH :D
O que eu acho ainda mais divertido é que o teu Português é do Brasil e o meu é de Portugal.
Tirei as minhas dúvidas de qual o Google Translate usa com: "Sistema Operacional - pt_BR" "Sistema Operativo - pt_PT" ;)

Grande abraço,
Gus

affonso:
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


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---// referência https://www.freepascal.org/docs-html/prog/progse55.html//arquivo subs.paslibrary subs;procedure SubStr(); cdecl;begin  write('hello World');end;exports  SubStr;end. 

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---// referência https://dlang.org/articles/dll-linux.html//arquivo Gethello.dimport 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


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---//referência https://dlang.org/articles/dll-linux.html//arquivo dll.dimport core.stdc.stdio;extern (C) int dll(int b){               int a = 10;        int c = a * b;        return c;} 

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---//referência https://www.freepascal.org/docs-html/prog/progse56.html// arquivo teste.pasprogram 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.

Navigation

[0] Message Index

[*] Previous page

Go to full version