View Full Version : [C++] Incompatibilità linking librerie fra compilatori diversi
trallallero
10-10-2007, 16:52
allora, sono entrato nel fantastico mondo Windows (eppure nel mio CV c'e´ scritto a chiare lettere che sono esperto su Unix/Linux :boh:) e comincio a chiedermi come possa un programmatore scegliere un sistema del genere:
anti intuitivo, anti logico, anti tutto.
Comunque ormai alea iacta est quindi ... e poi per progettare la comunicazione tra soldati che guidano un carro armato virtuale ne vale la pena :D
sto lavorando con Eclipse, compilando un programma con g++.
Devo usare una funzione in una libreria diciamo lib.dll quindi metto
-L<dir> e -llib (giusto ?)
Beh, compila e linka se NON uso la funzione, come cerco di usarla:
undefined reference to ...
:help:
cdimauro
10-10-2007, 20:24
allora, sono entrato nel fantastico mondo Windows (eppure nel mio CV c'e´ scritto a chiare lettere che sono esperto su Unix/Linux :boh:) e comincio a chiedermi come possa un programmatore scegliere un sistema del genere:
anti intuitivo, anti logico, anti tutto.
Torna a lavorare con Linux allora. Io quando ho sviluppato con Visual Studio 2005 Express in C++ non ho avuto alcun problema.
mad_hhatter
10-10-2007, 23:07
Torna a lavorare con Linux allora. Io quando ho sviluppato con Visual Studio 2005 Express in C++ non ho avuto alcun problema.
e quindi? perche' non gli dai una mano allora?
trallallero
11-10-2007, 07:11
e quindi? perche' non gli dai una mano allora?
forse ha ragione, ho aperto un 3d chiedendo aiuto ma spalando merda su windows :D
cdimauro
11-10-2007, 07:29
Esattamente: non mi sembra il modo corretto.
Comunque se vuoi lavorare in C++ in Windows il consiglio che ti posso dare è di passare a VS2005 C++ che è un ottimo ambiente di lavoro.
trallallero
11-10-2007, 07:34
Esattamente: non mi sembra il modo corretto.
Comunque se vuoi lavorare in C++ in Windows il consiglio che ti posso dare è di passare a VS2005 C++ che è un ottimo ambiente di lavoro.
non posso perche´ sono appena entrato in una nuova societa´ e devo usare i loro strumenti. Ho anche VS2005 ma, a parte che e´ in tedesco, non penso mi possa risolvere il problema delle librerie.
Comunque grazie lo stesso
Solitamente ti vengono dati due file. Il .dll e il .a, te devi linkare il .a al tuo eseguibile.
Se non hai il .a allora devi richiamare la funzione a runtime tramite LoadLibrary e GetProcAddress. http://msdn2.microsoft.com/it-it/library/64tkc9y5(VS.80).aspx
Esattamente: non mi sembra il modo corretto.
E poi perché uno non può dire che non gli piace Windows ? Siamo sempre liberi di non rispondere se la forma della domanda non ci piace ;)
trallallero
11-10-2007, 08:12
Solitamente ti vengono dati due file. Il .dll e il .a, te devi linkare il .a al tuo eseguibile.
ma il .a non e´ una lib statica ? in lLinux lo e´
E poi perché uno non può dire che non gli piace Windows ? Siamo sempre liberi di non rispondere se la forma della domanda non ci piace ;)
beh non ha tutti i torti dai, chiedo aiuto ma dico: windows sheißer!
(come veramente sento dire spesso dire qui :asd:)
E´ che ieri non c'ho visto piu´, dopo 2 ore a cercare di capire come andava mi son sfogato aprendo un 3d denigratorio ... chiedo scusa :stordita:
trallallero
11-10-2007, 08:13
Solitamente ti vengono dati due file. Il .dll e il .a, te devi linkare il .a al tuo eseguibile.
Se non hai il .a allora devi richiamare la funzione a runtime tramite LoadLibrary e GetProcAddress. http://msdn2.microsoft.com/it-it/library/64tkc9y5(VS.80).aspx
hai editato ?
ok, grazie del link :)
Sì ;)
Il .a è la libreria statica, ma non credo che il .dll sia nella forma linkabile dal gcc.
Se si vuole fare un linking dinamico suppongo che si debba ricorrere all'installazione della shell di Cygwin o di MSYS per poter gestire tutta la questione ld.
trallallero
11-10-2007, 08:28
Sì ;)
Il .a è la libreria statica, ma non credo che il .dll sia nella forma linkabile dal gcc.
Se si vuole fare un linking dinamico suppongo che si debba ricorrere all'installazione della shell di Cygwin o di MSYS per poter gestire tutta la questione ld.
o maró!!! LoadLibrary ... GetProcAddress ... nel codice mi devo caricare la libreria e ottenere l'indirizzo di ogni funzione ???
ritiro le scuse, fa proprio schifo :D
il dll non e´ nostro ma di una soc. esterna, qui abbiamo solo il .h
ho anche dovuto installare msys e mingw ma per adesso son solo li, non saprei neanche cosa farci.
Chiaro che devi caricarla una ad una, se vuoi usare il solo .dll.
Ma il .a ce l'hai ?
Sinceramente non ho mai linkato dinamicamente con GCC, ci sta che basti impostare il tipo di linking con qualche opzione del compilatore. In Linux come facevi ?
ilsensine
11-10-2007, 08:44
ma il .a non e´ una lib statica ? in lLinux lo e´
Sotto windows le cose funzionano in modo un pò differente.
Dovrebbe essere possibile per gcc, se ricordo bene, linkare direttamente una dll. Controlla che, se la dll è in c e il tuo codice in c++, l'header contenga gli extern "C" necessari. Viceversa se la dll è in c++, deve essere stata generata anch'essa da un g++ in quanto non c'è un modo unico con cui i diversi compilatori effettuano il mangle dei simboli c++.
trallallero
11-10-2007, 08:53
Chiaro che devi caricarla una ad una, se vuoi usare il solo .dll.
Ma il .a ce l'hai ?
Sinceramente non ho mai linkato dinamicamente con GCC, ci sta che basti impostare il tipo di linking con qualche opzione del compilatore. In Linux come facevi ?
il linux basta mettere -L<dir> e -l <nome lib> dove <nome lib> sta per nome senza lib iniziale ed estensione (libpippo.so diventa -lpippo)
Il .a non ce l'ho ma comunque mi rifiuto di linkarla statica
ho trovato del codice qui in rete e fanno come dici tu. LoadLib e GetProc ...
Sotto windows le cose funzionano in modo un pò differente.
Dovrebbe essere possibile per gcc, se ricordo bene, linkare direttamente una dll. Controlla che, se la dll è in c e il tuo codice in c++, l'header contenga gli extern "C" necessari. Viceversa se la dll è in c++, deve essere stata generata anch'essa da un g++ in quanto non c'è un modo unico con cui i diversi compilatori effettuano il mangle dei simboli c++.
e´ tutto in C++ (nel senso che hanno usato il c++ come linguaggio ma ... procedurale :boh: non ho ancora visto una classe) quindi non penso sia quello il problema.
Quello che voleva sapere ilsensine è se la dll è stata creata con gcc o con un altro compilatore.
ilsensine
11-10-2007, 08:56
Esatto. I nomi delle funzioni vengono rappresentati in maniera diversa dai diversi compilatori c++.
trallallero
11-10-2007, 08:58
ah ok, scusa. Non so perche´la dll e´stata fatta da una soc esterna ... in Rep Ceca.
Ho trovato pero´ la relativa lib. Quindi ho una .dll e una .lib
Allora se hai un .lib sicuramente non è stata fatta con GCC.
Mi immagino che il sorgente non ci sia :(
ilsensine
11-10-2007, 09:14
Ricorda che se vedi le brutte puoi sempre usare LoadLibrary & co. Solo ricorda che la stringa da passare a GetProcAddress è il nome "mangled" delle funzioni, che devi estrarre dalla dll.
trallallero
11-10-2007, 09:25
Allora se hai un .lib sicuramente non è stata fatta con GCC.
Mi immagino che il sorgente non ci sia :(
assolutamente no. E odio non avere il sorgente!
Perche´ dici che se ho la lib non e´ fatta col gcc ?
Ricorda che se vedi le brutte puoi sempre usare LoadLibrary & co. Solo ricorda che la stringa da passare a GetProcAddress è il nome "mangled" delle funzioni, che devi estrarre dalla dll.
infatti sto usando quel metodo perche´ proprio non mi va di impazzire a cercare un modo per linkare in maniera umana.
Ma siete d'accordo che fa schifo come sistema o e` solo una mia idea ?
Perche´ dici che se ho la lib non e´ fatta col gcc ?
Perché altrimenti avresti il .a :stordita:
trallallero
11-10-2007, 09:33
Perché altrimenti avresti il .a :stordita:
scusa se sembro stordito (alias: rincoglionito :D) ma con gcc->ld (su Linux) puoi scegliere se creare una lib statica o dinamica quindi continuo a non capire :what:
L'estensione delle librerie statiche create dai compilatori Microsoft (e da altri, a dire la verità) è .lib. L'estensione che solitamente si usa per le librerie statiche create da gcc è .a.
Se te hai una libreria statica chiamata .lib allora significa che molto probabilmente non è stata fatta con il gcc ;)
trallallero
11-10-2007, 09:47
L'estensione delle librerie statiche create dai compilatori Microsoft (e da altri, a dire la verità) è .lib. L'estensione che solitamente si usa per le librerie statiche create da gcc è .a.
Se te hai una libreria statica chiamata .lib allora significa che molto probabilmente non è stata fatta con il gcc ;)
ma ho una .lib dinamica (penso). Ieri un tipo qui mi ha spiegato che la .dll non basta, serve una .lib come interfaccia (per i simboli) quando linki. Una volta linkato basta la dll come libreria dinamica ma quando linki hai bisogno anche della lib.
E son corso in bagno a vomitare :D
PS: oggi mi trovo qui praticamente da solo, con Windows in tedesco, Visual Studio in tedesco (non puoi installare Visual Studio in una lingua diversa da quella del S.O.!!! :muro: ) , Eclipse (in inglese), una dll sconosciuta senza documentazione, una lib che non so cosa sia e hwupgrade ... mi sa che passero´ molto tempo su quest'ultimo :asd:
In ogni caso l'estensione .lib non ha niente a che vedere con gcc...
^TiGeRShArK^
11-10-2007, 09:56
ma ho una .lib dinamica (penso). Ieri un tipo qui mi ha spiegato che la .dll non basta, serve una .lib come interfaccia (per i simboli) quando linki. Una volta linkato basta la dll come libreria dinamica ma quando linki hai bisogno anche della lib.
E son corso in bagno a vomitare :D
PS: oggi mi trovo qui praticamente da solo, con Windows in tedesco, Visual Studio in tedesco (non puoi installare Visual Studio in una lingua diversa da quella del S.O.!!! :muro: ) , Eclipse (in inglese), una dll sconosciuta senza documentazione, una lib che non so cosa sia e hwupgrade ... mi sa che passero´ molto tempo su quest'ultimo :asd:
:vicini:
però purtroppo non ti posso essere d'aiuto che non ho mai avuto necessità di linkare una dll :p
guarda piuttosto se seguendo queste istruzioni riesci quanto meno ad avere visual studio in inglese :asd:
http://blogs.msdn.com/astebner/archive/2006/03/24/560579.aspx
cdimauro
11-10-2007, 10:08
E poi perché uno non può dire che non gli piace Windows ? Siamo sempre liberi di non rispondere se la forma della domanda non ci piace ;)
Certamente. L'importante è non generalizzare le proprie impressioni, visto che esistono altri programmatori che hanno un'opinione completamente diversa e perfettamente legittima. ;)
Fine OT
cdimauro
11-10-2007, 10:10
Ma siete d'accordo che fa schifo come sistema o e` solo una mia idea ?
Devi entrare nell'ottica che è un sistema diverso, coi suoi pregi e i suoi difetti.
La pietra filosofale dell'informatica non ce l'ha nessuno.
trallallero
11-10-2007, 10:11
:vicini:
però purtroppo non ti posso essere d'aiuto che non ho mai avuto necessità di linkare una dll :p
guarda piuttosto se seguendo queste istruzioni riesci quanto meno ad avere visual studio in inglese :asd:
http://blogs.msdn.com/astebner/archive/2006/03/24/560579.aspx
grazie caro ma dice chiaramente questo:
You have to have the English version in order to change the UI to use English strings.
:boh:
comunque e´ un buon modo per doverlo imparare ;)
cdimauro
11-10-2007, 10:12
L'estensione delle librerie statiche create dai compilatori Microsoft (e da altri, a dire la verità) è .lib. L'estensione che solitamente si usa per le librerie statiche create da gcc è .a.
Se te hai una libreria statica chiamata .lib allora significa che molto probabilmente non è stata fatta con il gcc ;)
Esattamente. Esistono differenze già fra compilatori per la stessa piattaforma: figuriamoci fra compilatori diversi su piattaforme diverse.
trallallero
11-10-2007, 10:22
Devi entrare nell'ottica che è un sistema diverso, coi suoi pregi e i suoi difetti.
La pietra filosofale dell'informatica non ce l'ha nessuno.
infatti proprio perche´ e´ diverso che dico che per me fa schifo.
Gia´ ai tempi del VC, nel 1999, non riuscivo proprio a capire come creare un programma senza dover leggere quintali di documentazione e fare cose contro ogni logica, senza sapere il perche´. Poi, lo stesso programma, sul Borland Builder lo facevi in 2 ore conoscendo il C++, leggendo quel che basta per capire come funzionano gli oggetti Borland e usando la logica umana.
Adesso mi ritrovo in un sistema nuovo (conosco Windows ma non ci lavoro da anni) e non e´ che mi trovo spaesato, come le prime volte su Unix-Linux dove comunque bastava andar di logica, ma completamente perso.
Perche´ ho bisogno di una lib e una dll ? perche´ non basta una semplice libreria dinamica ? perche´ mi devo caricare la lib dal sorgente ? perche´la devo liberare alla fine ? e perche´devo andare a trovare l'indirizzo di tutte le funzioni ? a me sembra assurdo :boh:
In teoria, a quanto pare, basta anche la dll, ma deve essere compilata da g++ ;)
Gli altri compilatori fanno cose diverse. I compilatori MS hanno bisogno comunque di un file lib anche per la versione dinamica (che non contiene altro che gli import che altrimenti devi farti a mano). In generale non è quindi obbligatorio caricare la dll, le funzioni e chiudere la dll aperta, perché viene fatto tutto in modo trasparente.
Nota che l'importazione dinamica di una shared library può essere fatta anche su Linux con dlopen ;)
Quindi a questo punto il problema non è Windows, ma l'incompatibilità fra la libreria che ti hanno dato ed il compilatore che usi.
Potresti usare Code::Blocks come IDE con il compilatore Intel distribuito con l'sdk...
trallallero
11-10-2007, 11:18
In teoria, a quanto pare, basta anche la dll, ma deve essere compilata da g++ ;)
Gli altri compilatori fanno cose diverse. I compilatori MS hanno bisogno comunque di un file lib anche per la versione dinamica (che non contiene altro che gli import che altrimenti devi farti a mano). In generale non è quindi obbligatorio caricare la dll, le funzioni e chiudere la dll aperta, perché viene fatto tutto in modo trasparente.
Nota che l'importazione dinamica di una shared library può essere fatta anche su Linux con dlopen ;)
Quindi a questo punto il problema non è Windows, ma l'incompatibilità fra la libreria che ti hanno dato ed il compilatore che usi.
Potresti usare Code::Blocks come IDE con il compilatore Intel distribuito con l'sdk...
grazie per tutte le info :mano:
purtroppo qui si usa solo quello deciso dall'azienda (e mi sembra anche giusto). Per esempio non ho potuto scaricare Eclipse ma ho dovuto installarlo da un disco loro, con certi plugins.
Quindi non posso usare Code::Blocks
edit - tutto risolto vedo :D
sigh, arrivo tardi
trallallero
11-10-2007, 12:54
edit - tutto risolto vedo :D
sigh, arrivo tardi
beh 'nsomma, risolto e´ una parola grossa :D
Se non hai ancora risolto, puoi trasformare un .lib in .a usando reimp o dlltool (devi avere anche la dll)
trallallero
12-10-2007, 15:28
Se non hai ancora risolto, puoi trasformare un .lib in .a usando reimp o dlltool (devi avere anche la dll)
ho risolto nel senso che uso LoadLibrary etc ... ha vinto Windows :D
peró grazie, prendo nota.
Almeno tu dai consigli invece di inzozzare il 3d come fanno altri con Zune, Xbox e altre michiate varie :O
variabilepippo
12-10-2007, 15:41
Perche´ ho bisogno di una lib e una dll ? perche´ non basta una semplice libreria dinamica ? perche´ mi devo caricare la lib dal sorgente ? perche´la devo liberare alla fine ? e perche´devo andare a trovare l'indirizzo di tutte le funzioni ? a me sembra assurdo
Per pura curiosità: la DLL è stata scritta da te o fa parte di una qualche libreria?
Di solito a corredo della DLL viene fornito un .h (o un altro meccanismo) che ne agevola l'utilizzo nel programma "client".
Almeno tu dai consigli invece di inzozzare il 3d come fanno altri con Zune, Xbox e altre michiate varie
Nei forum, per definizione, si discute... Quando si va troppo off-topic interviene il moderatore.
Nei forum, per definizione, si discute... Quando si va troppo off-topic interviene il moderatore.
Mi sembrava che partecipasse anche trallallero alla discussione :mbe:
Se pensate che la discussione sia andata off-topic segnalate.
Ho diviso i due thread.
http://www.hwupgrade.it/forum/showthread.php?p=19128724#post19128724
Se non hai ancora risolto, puoi trasformare un .lib in .a usando reimp o dlltool (devi avere anche la dll)
Sai se si può ottenere una libreria dinamica invece che la sola libreria statica ?
Edit: ho visto ora che il .a che ti crea dlltool sembra che non sia la versione statica, ma che di fatto faccia da solo l'import delle funzioni per usare la libreria in forma dinamica. Quindi trallalero, questa è la soluzione al tuo problema.
trallallero
15-10-2007, 07:50
Per pura curiosità: la DLL è stata scritta da te o fa parte di una qualche libreria?
no, scritta da altri
Di solito a corredo della DLL viene fornito un .h (o un altro meccanismo) che ne agevola l'utilizzo nel programma "client".
si, il .h ovviamente c'é ma senza commenti, solo prototipi e defines.
Nei forum, per definizione, si discute... Quando si va troppo off-topic interviene il moderatore.
ma dai, io scherzo sempre ;)
trallallero
15-10-2007, 08:07
Mi sembrava che partecipasse anche trallallero alla discussione :mbe:
Se pensate che la discussione sia andata off-topic segnalate.
Ho diviso i due thread.
http://www.hwupgrade.it/forum/showthread.php?p=19128724#post19128724
mannaggia a me che ho tolto la firma "avviso messaggio ironico" :doh:
dai non serviva ...
Sai se si può ottenere una libreria dinamica invece che la sola libreria statica ?
Edit: ho visto ora che il .a che ti crea dlltool sembra che non sia la versione statica, ma che di fatto faccia da solo l'import delle funzioni per usare la libreria in forma dinamica. Quindi trallalero, questa è la soluzione al tuo problema.
ok, grazie prendo nota. Non posso provare subito perché mi hanno giá assegnato un altro compito ... studiare Mumble :boh:
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.