* * * *

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, 01:14:27 am

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

206 Visitatori, 0 Utenti

Autore Topic: Link librerie statiche  (Letto 14189 volte)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #15 il: Gennaio 08, 2016, 07:41:34 pm »
Aggiornamento.
La libreria ".a" essendo scritta in c++ potrebbe avere qualche problema col linker?
Non so, sta di fatto che non ho capito come fare il bind statico.
Amen.
Nel controllare gli howto e demo di Newton-dynamics mi sono accorto che SDL per freepascal è abbastanza indietro ... :( 2013 per capirci. Ma SDL mi sembra sia un pochino più aggiornato. (Il repository controllato oggi mi dice 5 days ago   release-2.0.4 ...)
C'è qualche repository più aggiornato rispetto a quello jedy?

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 #16 il: Gennaio 09, 2016, 12:15:08 pm »
Ciao a tutti.
https://github.com/danpla/sdl2-fpc

Trovato questo :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 #17 il: Gennaio 09, 2016, 02:49:25 pm »
dicci Stilgar, cosa bolle in pentola? :)
Imagination is more important than knowledge (A.Einstein)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #18 il: Gennaio 09, 2016, 02:52:19 pm »
Niente.
Avevo tempo e non sapevo come impegnarlo :D


:p
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 #19 il: Gennaio 09, 2016, 03:00:31 pm »
non ci credo :D

tira fuori il progetto di esempio hahahahaah
Imagination is more important than knowledge (A.Einstein)

Legolas

  • Global Moderator
  • Sr. Member
  • *****
  • Post: 366
  • Karma: +3/-0
Re:Link librerie statiche
« Risposta #20 il: Gennaio 10, 2016, 12:00:27 pm »
La libreria ".a" essendo scritta in c++ potrebbe avere qualche problema col linker?
Non so, sta di fatto che non ho capito come fare il bind statico.

In teoria no, in pratica devi stare attento all'ordine in cui le librerie esterne vengono linkate nel tuo eseguibile, ma questo vale anche per librerie scritte in c. Se ti va di condividere in uno zippone il punto in cui ti sei bloccato, posso provare a darci uno sguardo :)

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #21 il: Gennaio 10, 2016, 03:45:28 pm »
https://sourceforge.net/p/lazarusiug/liug/HEAD/tree/trunk/bindings/newtonApplication/

Ho già pubblicato lo stato attuale su sourceforge.
Se non sbaglio sei già amministratore come  "p4p3r0" .. :D
Non ti arrivano le notifiche per mail?

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 #22 il: Gennaio 10, 2016, 05:00:37 pm »
Uh... no, in effetti  :D

Devo vedere se mi vanno in spam o le ho disattivate sul profilo...

Comunque vedo di darci un'occhiata

EDIT: appunto, avevo le notifiche disattivate  ;D
« Ultima modifica: Gennaio 10, 2016, 05:05:05 pm da Legolas »

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #23 il: Gennaio 15, 2016, 12:20:23 am »
Mingw mi sta facendo impazzire.
Ho creato una macchina virtuale e ho installato debian.

Vediamo se sotto linux le cose vanno meglio :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 #24 il: Gennaio 15, 2016, 10:30:13 am »
Ok, ho avuto modo di giocareci un pochino per vedere come linkare staticamente la baracca.

La risposta è che non si può, almeno non direttamente. Provando a linkare la libreria statica libNewton.a, il linker non trova delle funzioni (_Z1vattelappesca). Quel prefisso _Z1 indica che si tratta di nomi di funzioni mangled, assegnate dal compilatore c++.

Per accedervi dal free pascal, come dicevo, bisognerebbe wrappare la libreria c++ in una c, compilarla con gcc e utilizzare la libreria ottenuta, nella quale non ci dovrebbero più essere nomi di funzioni mangled, per linkarla con il free pascal.

Si stava lavorando su una soluzione interna, che permette di dichiarare classi presenti in una libreria esterna in c++, ma al momento è tutto fermo. L'ho provata su una libreria semplicissima e sembra funzionare, ma ho paura che per una libreria complessa come newton non sia ancora pronta... In ogni caso, se vuoi darci un'occhiata:
http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/tests/test/cg/tcppcl1.pp
http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/tests/test/cg/tcppcl2.pp

PS. Che problemi ti da Mingw?

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #25 il: Gennaio 15, 2016, 01:16:29 pm »
Gli stessi che hai appena spiegato tu :D
Speravo fosse una menata del porting per windows del GCC visto che la versione di Linux non introduce "_" prima del nome della funzione :D

Controllo i link che hai messo.

Grazie.

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 #26 il: Gennaio 15, 2016, 01:32:23 pm »
Legolas.
Se controlli i log del linker su Windows e quelli del linker su Linux sono abbastanza differenti.
Quello per Windows si incasina con i nomi e basta.
Quello per Linux mi indica problemi con le classi c++

Per questo dicevo che Mingw mi faceva impazzire ;)

Sembra che il linker si trovi a non trovare i simboli con "classe->metodo", ma in effetti sono le funzioni wrapper (newton le wrappa già per poter esporre funzioni semplici tramite dll) a chiamare le classi internamente. Quindi newton ha già "Spianto" le funzioni.
Riwrapparle non credo risolva il problema  :'(
 

(Si lo so.. mettere su una macchina virtuale con Linux per lanciare una compilazione è come asciugarsi i capelli con un turbo reattore per aerei, ma visto che c'ero mi sono preparato anche un macchina virtuale con haiku os, tanto per vedere il porting lazarus girare :D ).

Stilgar

PS:
Controllando le estensioni al linguaggio che stanno provando vedo i test, ma non il c++ che genera quelle classi.
Poi linkano classe per classe. quindi i ".o" e non la ".a"
Se al linker sotto Lazarus ci fosse un benedetto parametro per dirgli si smenare codice oggetto c++ e non c (o come lo interpreta lui ....)
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 #27 il: Gennaio 15, 2016, 02:13:50 pm »
Aspe' :D

Allora, prendiamo il log su windows. Questo è uno degli errori:

C:\lavoro\lazarus\code\libraries\liug\trunk\bindings\newtonApplication\pck\NewtonDemos.lpr(19,1) Error: Multiple defined symbol __ZNK5dgRef9GetTypeIdEv

Facendo un demangling casereccio, si fa riferimento al metodo GetTypeId della classe dgRef. Nei sorgenti non trovo da nessuna parte la funzione spianata GetTypeId che richiama il metodo dalla classe. Per questo dico che non ci sono le funzioni "spianate" :D

Ci dovrebbe essere da qualche parte un file c con una cosa del tipo

Codice: [Seleziona]

int GetTypeId() {
    return dgRef.GetTypeId();
}


e un file h in cui viene esportata la funzione GetTypeId.

Stilgar

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2391
  • Karma: +10/-0
Re:Link librerie statiche
« Risposta #28 il: Gennaio 15, 2016, 02:52:01 pm »
Si esiste quel metodo.

Codice: [Seleziona]
class dgRef: public dgRefFlags
{
[..]
   virtual dgUnsigned32 GetTypeId () const;
[..]
}
Il "problema" è che non viene usato in fase di export ....
Quindi cosa serve creare una funzione che prenda in ingresso dgRef * per darti un dato che non "serve" al chiamante esterno?

Sono confuso...

Prendiamo ad esempio questo pezzo di codice:
Codice: [Seleziona]
// Name: NewtonCreate 
// Create an instance of the Newton world.
//
// Parameters:
// *NewtonAllocMemory* mallocFnt -    is a pointer to the memory allocator callback function. If this parameter is
//                                    NULL the standard *malloc* function is used.
// *NewtonFreeMemory* mfreeFnt -    is a pointer to the memory release callback function. If this parameter is NULL
//                                    the standard *free* function is used.
//
// Return: a pointer to an instance of the Newton world.
//
// Remarks: this function must be called before any of the other API functions.
//
//
// See also: NewtonDestroy, NewtonDestroyAllBodies
NewtonWorld* NewtonCreate()
{
    TRACE_FUNCTION(__FUNCTION__);
    dgMemoryAllocator* const allocator = new dgMemoryAllocator();

    NewtonWorld* const world = (NewtonWorld*) new (allocator) Newton (dgFloat32(1.0f), allocator);
    return world;
}

// Name: NewtonDestroy
// Destroy an instance of the Newton world.
//
// Parameters:
// *const NewtonWorld* *newtonWorld - is the pointer to the Newton world.
//
// Return: Nothing.
//
// Remarks: This function will destroy the entire Newton world.
//
// See also: NewtonCreate, NewtonDestroyAllBodies
void NewtonDestroy(const NewtonWorld* const newtonWorld)
{
    TRACE_FUNCTION(__FUNCTION__);
   
    Newton* const world = (Newton *) newtonWorld;
    dgMemoryAllocator* const allocator = world->dgWorld::GetAllocator();

    delete world;
    delete allocator;
}

La prima funzione chiama 2 classi.
Newton e dgMemoryAllocator.
Crea dgMemoryAllocator e lo passa come parametro al costruttore di Newton.

La seconda a partire dal parametro che gli si passa esegue il cast. Ottiene l'allocator e distrugge entrambe le istanze.

Da quello che mi sembra di capire del tuo suggerimento:
Dovrei creare delle funzioni del tipo:

Codice: [Seleziona]

void * NewtonWorld(void* instance)
{
  Newton* const world = (Newton *) instance;
  return world->dgWorld;
}
Poi però il codice originale continuerebbe a non usare questa funzione. Quindi mi sfugge il significato di scrivere funzioni che non sono usate internamente :D

Cioè dovessi mappare tutte le classi (cosa che con i test che hai linkato si potrebbe pure fare :D ) avrebbe senso spianare tutta la libreria.
Poi però le chiamte "interne" sarebbero fatte lo stesso in c++. Quindi mi sento "confuso e infelice". La trovo una cosa senza senso ... poi mi sbaglierò e verrà fuori che bisogna simulare le chiamate alla VMT del c++ :D

Da quello che ho capito, la "spianatura" serve solo per le chiamate esterne non in c++.

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 #29 il: Gennaio 19, 2016, 10:51:28 am »
Infatti, serviva solo per le chiamate esterne.

Però.

Qualche anno fa mi contattò Gilles Marcou, che stava scrivendo la guida su come linkare in free pascal librerie in c\c+. Mi inviò un'anteprima del documento che stava scrivendo, per controllare se ci fossero inesattezze. Allora, (parlo di circa 10 anni fa!) provai a compilare i progetti di esempio e, se la memoria non mi fa difetto, filò tutto liscio, tant'è che poi la guida è stata pubblicata.  ;D

L'altro giorno ho provato a ricompilare gli esempi della guida e SBAM! sono usciti fuori gli errori che stiamo incontrando con Newton!  :o

Ora, di cose da 10 anni a questa parte ne sono cambiate, quindi è difficile dire con esattezza cosa può aver determinato gli errori in fase di linking...  ???

Nel frattempo credo che bisognerà accontentarsi di utilizzare la dll, oppure di "embeddarla" nell'eseguibile come risorsa...  :-\

 

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: 206
Total: 206

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.