Newsgroup: it.comp.lang.c++
Titolo: Domanda da profano: .lib vs .a

Ciao a tutti,
che differenza c'è tra lie librerie statiche .lib e quelle .a? Per la 
precisione: mi trovo a dover utilizzare con MinGW delle librerie di 
terze parti .lib (ottenute con VisualC++ e di cui non ho i sorgenti), 
come posso fare?
Grazie in anticipo,
Giulio
-- 
OnAir: Ark - "Silent is the rain"

 come posso fare?
Esattamente come se fossero .a, ABI C++ a parte (leggi: se contengono 
classi non puoi mischiare due compilatori diversi).
  bye
	av.

 classi non puoi mischiare due compilatori diversi).
Ecco, questo allora è un problema! ;-)
BTW: ora sto compilando la stessa libreria con gcc sotto cygwin, ma "a 
regime" dovrei usarla in applicazioni compilate con MinGW. Anche se sono 
entrambi porting di GCC, credi che possa avere qualche problema?
Grazie,
Giulio
-- 
OnAir:

 entrambi porting di GCC, credi che possa avere qualche problema?
Probabile, il mingw, per essere compatibile con il runtime del visual 
studio, spesso forza gli allineamenti delle strutture seguendo le regole 
del compilatore di microsoft. Inoltre se usi il cygwin hai a 
disposizione funzioni posix che con il mingw non hai, quindi ti conviene 
fare al + presto il "salto" :)
Bye,
  Gabry

 fare al + presto il "salto" :)
Ok, allora cestiniamo il cygwin.
Il problema ora è questo: ho compilato una libreria *stupidissima* con 
VisualStudio (usando come template Win32/static library). Il codice 
della libreria è il seguente:
*header*
class Foo
{
	int s;
public:
	Foo(int seed);
	int getSeed();
	int incrementSeed();
	int decrementSeed();
public:
	~Foo();
};
*Foo.cpp*
#include "Foo.h"
#include <iostream>
using namespace std;
Foo::Foo(int seed) { s = seed; }
Foo::~Foo(){ }
int Foo::getSeed() { return s; }
int Foo::incrementSeed() { return ++s; }
int Foo::decrementSeed() {return --s;}
L'ho compilata ed ho ottenuto il file FooLib.lib che dovrebbe 
rappresentare la mia libreria statica.
Ho scritto una applicazione di test altrettanto stupida:
*FooTest.cpp*
#include <iostream>
#include "Foo.h"
using namespace std;
int main()
{
	Foo f(19); cout << f.getSeed() << endl;
	cout << f.incrementSeed() << endl; cout << f.getSeed() << endl;
	cout << f.decrementSeed() << endl; cout << f.getSeed() << endl;
}
La "situazione" del mio file system è questa:
FooTest.cpp
./include
	Foo.h
./lib
	FooLib.lib
Se do il comando:
*>> g++ FooTest.cpp -o FooTest.exe -I./include -L./lib -lFooLib*
ottengo "undefined reference" per tutti i membri di Foo.
Se invece do:
*>> g++ FooTest.cpp -o FooTest.exe -I./include -L./lib -lFooLib.lib*
aggiungendo cioè l'estensione ".lib", ho un errore del linker che mi 
dice che non riesce a trovare il file "-lFooLib.lib".
Qualche consiglio?
E' il caso che posto anche su it.comp.programmare.win32? ;-)
Grazie,
Giulio
--
OnAir: Freak Kitchen - "Breathe"

 E' il caso che posto anche su it.comp.programmare.win32? ;-)
Direi di si :) Io pero' quel gruppo non lo seguo, nel caso manda via 
mail privata, ci avrei provato io, ma il tuo indirizzo e' troppo fasullo :)
Gabry

 mail privata, ci avrei provato io, ma il tuo indirizzo e' troppo fasullo :)
:-D
Ciao e grazie,
Giulio
-- 
OnAir:

 corrispondente?
Aprilo con notepad e studiatelo un poco. Con un linguaggio di script di 
tua gradimento probabilmente riesci a convertitelo da solo con poco.
-- 
v-day video: 
http://www.radioradicale.it/scheda/234532
il capitalismo: 
http://www.rat-man.com/site/IT/IT/rat_cartoon.ashx?mn=5

 tua gradimento probabilmente riesci a convertitelo da solo con poco.
Considera che non sono un esperto di makefile (anzi, diciamo che non ne 
so nulla). Comunque mi ero fatto uno script in python che produceva i 
comandi da passare al gcc, ma il seguente errore mi ha "tarpato le ali":
 >> adler32.c:57: error: `uLong adler32' redeclared as different kind of 
symbol
Cosa significa?
Grazie,
Giulio
-- 
OnAir:

 Cosa significa?
Immagino che alla riga 57 del file adler32.c ci sia una variabile già 
definita altrove o simili.
Analizza la riga 57 e vedi se la variabile adler32 non sia già 
definita.
-- 
il capitalismo: 
http://www.rat-man.com/site/IT/IT/rat_cartoon.ashx?mn=5

 E' il caso che posto anche su it.comp.programmare.win32? ;-)
Fin qui mi sembra che tu non sia OT; la piega che ha preso l'altro ramo 
del thread (quella sui makefile), pero', lo e'.
  bye
	av.

 Analizza la riga 57 e vedi se la variabile adler32 non sia già definita.
Quello che dava fastidio al compilatore erano funzioni dichiarate in 
questo modo:
int somma(x,y)
	int x,
	int y,
{
	return x+y;
}
Con un po' di pazienza sto cercando di correggerle tutte.


 esatti,[cut]
Ok, grazie!
Sei stato chiarissimo.
Ciao,
Giulio
-- 
OnAir: