* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Aprile 22, 2025, 04:40:19 am

Inserisci il nome utente, la password e la durata della sessione.

179 Visitatori, 0 Utenti

Autore Topic: Link librerie statiche  (Letto 14212 volte)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Link librerie statiche
« il: Gennaio 06, 2016, 12:03:12 pm »
Ciao a tutti.
Mi chiedevo per poter "linkare" una libreria non dinamicamente (dll) come devo compilare la libreria.
Entrando del dettaglio, voglio fare il binding di "newton dynamics" ( http://newtondynamics.com ) per Lazarus, dinamico e statico.
La libreria è Open Source ( https://github.com/MADEAPPS/newton-dynamics/ ), quindi posso ricompilarmela come voglio
Vorrei poter eseguire entrambi i tipi di binding.
Arrivando al cuore del dubbio. Che compilatore devo usare (c/c++) per poter fare in modo che FPC linki correttamente?
Non continuo con i miei dubbi per non influenzarvi :p
Intanto continuo con il binding dinamico :D

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2984
  • Karma: +20/-4
Re:Link librerie statiche
« Risposta #1 il: Gennaio 06, 2016, 01:00:37 pm »
sotto linux non dovresti avere troppi problemi (l'ottimismo non è mai troppo :D) basta che usi strumenti (ld, as, make) della famiglia GNU. per win devi usare ming32.

credo però che prima dovresti leggerti bene questo
http://www.stack.nl/~marcov/buildfaq.pdf
quà troverai molte risposte

leggi poi anche questo thread che parla di come compilare sqllite in un binario fpc
http://forum.lazarus.freepascal.org/index.php/topic,15712.msg84781.html?PHPSESSID=2b185813402f5371265f404f46af9ebe#msg84781

buon lavoro e suprattutto facci sapere! ;)

Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #2 il: Gennaio 06, 2016, 01:01:52 pm »
Inizio a studiare :D
Grazie Nomore ;)

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #3 il: Gennaio 06, 2016, 01:06:03 pm »
Da una prima veloce lettura emerge che non si possono usare gli strumenti microsoft.

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2984
  • Karma: +20/-4
Re:Link librerie statiche
« Risposta #4 il: Gennaio 06, 2016, 01:10:53 pm »
già, solo GNU (o cygwin o ming)
Imagination is more important than knowledge (A.Einstein)

Legolas

  • Global Moderator
  • Sr. Member
  • *****
  • Post: 366
  • Karma: +3/-0
Re:Link librerie statiche
« Risposta #5 il: Gennaio 06, 2016, 08:50:57 pm »
Per il DS linko staticamente la librerie libnds e quelle del gcc. Per farlo basta usare la direttiva linklib:

Codice: [Seleziona]
{$linklib nds9}

{$linklib c}
{$linklib gcc}
{$linklib g}

In questo caso le librerie linkate sono, rispettivamente, libnds9.a, libc.a, libgcc.a e libg.a.

Le funzioni chiamate hanno quest'aspetto:

Codice: [Seleziona]
function memcpy(dest: pointer; src: pointer; n: integer): pointer; cdecl; external;

Se hai problemi col nome delle funzioni puoi usare la direttiva name, ad esempio così:
Codice: [Seleziona]
function _memcpy(dest: pointer; src: pointer; n: integer): pointer; cdecl; external name 'memcpy';

Se hai bisogno di una mano fai un fischio. Buon lavoro! ;)
« Ultima modifica: Gennaio 06, 2016, 08:56:58 pm da Legolas »

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #6 il: Gennaio 07, 2016, 05:01:48 pm »
Grazie :D
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #7 il: Gennaio 07, 2016, 05:12:22 pm »
na.lpr(18,1) Error: Multiple defined symbol __ZN5dgRefD1Ev

Mumble... versione link statico ... :(

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #8 il: Gennaio 07, 2016, 05:59:11 pm »
Una curiosità ...
Sarà che le macro in c/c++ sono abituato ad usarle in un certo modo:

Definendo la macro

{$ifdef STATIC_BIND}
  {$define  NEWTON_API(apiName):=external name apiName}
  {$LinkLib libNewton}
{$else}
  {$define  NEWTON_API(apiName):=external ExternalLibrary apiName}
{$endif}     

Nell'uso il compilatore non si comporta come mi aspetterei. Mi sa semplicemente errore dicendo che NEWTON_API non è riconosciuto... :(

function NewtonAlloc(sizeInBytes: cint): pointer; cdecl; NEWTON_API('NewtonAlloc');
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

nomorelogic

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2984
  • Karma: +20/-4
Re:Link librerie statiche
« Risposta #9 il: Gennaio 07, 2016, 06:05:01 pm »
che apiname vada tra apici?
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #10 il: Gennaio 07, 2016, 07:24:18 pm »
Il compilatore riporta questo errore :
 newtonlib.pas(1206,58) Fatal: Syntax error, "BEGIN" expected but "identifier NEWTON_API" found
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Legolas

  • Global Moderator
  • Sr. Member
  • *****
  • Post: 366
  • Karma: +3/-0
Re:Link librerie statiche
« Risposta #11 il: Gennaio 07, 2016, 08:36:15 pm »
Per librerie scritte in c++ le cose si complicano leggermente, perché devi "spianarle" e wrapparne metodi, costruttore e distruttore in funzioni.

Qua c'è un tutorial ben fatto:

http://gd.tuwien.ac.at/languages/pascal/fpc/docs-pdf/CinFreePascal.pdf

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #12 il: Gennaio 08, 2016, 04:27:09 am »
Aggiornamento delle 4 e mezza di mattina.
Allora Bind da dll concluso.
Ho abbandonato la strada delle macro. Sembra non le digerisca come pensavo. Amen.

Legolas. Le funzioni sono già "spianate". Per questo dalla DLL si riesce a chiamare la parte interna scritta in C++.
Esempio:
Codice: [Seleziona]
// Name: NewtonGetMemoryUsed 
// Return the exact amount of memory use by the engine and any given time time.
//
// Parameters: none
//
// Return: total memory use by the engine.
//
// Remarks: this function is useful for application to determine if the memory use by the engine is balanced at all time.
//
// See also: NewtonCreate
int NewtonGetMemoryUsed()
{
   TRACE_FUNCTION(__FUNCTION__);
   return dgMemoryAllocator::GetGlobalMemoryUsed();
}



Sembra che nel ".a" ci sia un pochino di tutto (:D battuta).
Forse mi sta sfuggendo qualche opzione che non metto (ma che vorrei scrivere sul sorgente per renderlo esplicito :D)

Domani se ho tempo mi rimetto e mi scorno per bene :D

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

Legolas

  • Global Moderator
  • Sr. Member
  • *****
  • Post: 366
  • Karma: +3/-0
Re:Link librerie statiche
« Risposta #13 il: Gennaio 08, 2016, 11:24:25 am »
Uhm... ripensando alla macro che hai scritto più sopra: così non funziona, perché in fpc non sono supportati i parametri. Potresti provare con un accrocchio del genere:

Codice: [Seleziona]
{$MACRO ON}

{$ifdef STATIC_BIND}
  {$define  NEWTON_API:=external name}
{$else}
  {$define NEWTON_API:=external ExternalLibrary}
{$endif}

function NewtonAlloc(sizeInBytes: cint): pointer; cdecl; NEWTON_API 'NewtonAlloc';


che è più o meno quello che cercavi di fare  :D

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #14 il: Gennaio 08, 2016, 11:45:26 am »
Grande Legolas.
Hai trovato la strada giusta :D

L'orario non mi era d'aiuto ;)

Stilgar
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

 

Recenti

How To

Utenti
  • Utenti in totale: 817
  • Latest: alex6891
Stats
  • Post in totale: 19696
  • Topic in totale: 2367
  • Online Today: 204
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 179
Total: 179

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.