2012-11-18 14 views
5

Ho provato a collegare staticamente a sqlite3 senza esito positivo. Sto usando l'intestazione "etc.c.sqlite3" e la fusione sqlite3. Per creare il file .lib ho provato sia VC++ che MinGW-gcc, entrambi compilano correttamente il file sorgente, ma entrambi generano il formato oggetto COFF (optlink, che utilizza DMD, funziona con OMF). Dopo aver letto un sacco di post su 'digitalmars.D', ho provato diverse soluzioni.Collegamento statico di SQLite con DMD (Windows x86)

objconv:

  • cercato di convertire i file lib creato con GCC, ha portato in simboli non definiti quali __divdi3 e __muldi3, non è stato in grado di risolvere questo problema.

  • provato anche questo per convertire il file sqlite3.o a * .obj, e poi usare 'LIB.EXE' digitalmars - senza successo così

  • Tentare objconv su un VC++ lib generato fallisce perché: "SQLite lib è una libreria di importazione"

implib:

  • Se scarico la DLL precompilata da sqlite.org e uso IMPLIB, genera al file di ib, ma il nome storpiatura non sembra corrispondere, perché anche se mi collego con la libreria statica, ricevo ancora gli stessi errori SQLite (ad esempio, non definiti simbolo _sqlite3_open, _sqlite3_errmsg, _sqlite3_close ...

coffimplib:

  • Se uso coffimplib sul VC++ file di libreria creata, il programma genera un file di quasi vuoto (~ 2 KB), che contiene solo spazzatura (cioè senza simboli a tutti e solo i valori per lo piu 'Null').

  • Se faccio lo stesso con la libreria creata da GCC, coffimplib si lamenta di "non una libreria di importazione" e non viene generato alcun file di libreria convertito.

Se uso DMC per compilare l'amalgama sqlite3, la compilazione fallisce lamentando tonnellate di errori. Quindi eccomi, bloccato nel nulla, qualcuno ha qualche idea o consiglio su cosa potrebbe risolvere questo?

NOTA: non desidero utilizzare una DLL, ma collegamento statico con sqlite (per problemi di dimensioni eseguibili).

+0

Quali errori si ottiene con il compilatore C? –

+0

Tonnellate e tonnellate. Richiederebbe troppo per risolverli tutti, con tutti i tipi di errori (ad esempio cast illegale, identificatore sconosciuto) –

+0

Ho scaricato e provato DMC; sembra che gli errori siano causati da bug nei file di intestazione di Windows forniti con DMC. –

risposta

3

Provare a utilizzare implib con l'interruttore /system.

+0

Che in realtà ha fatto il trucco! Sebbene questo abbia creato una libreria di importazione, non una libreria statica, quindi l'eseguibile dipende ancora dall'intera dll sqlite quando usa solo ~ 5 delle sue funzioni –

0

Perché semplicemente non si compila e si collega il codice SQLite C con l'applicazione D? Immagino che salverà il tuo problema da quelli relativi alle librerie.

Naturalmente una buona alternativa è quella di compilare la libreria statica SQLite con DMC, e usarlo con il progetto D semplicemente facendo: dmd -of myproggy myproggy.d somefile.d libsqlite.lib

+0

Dmc non riesce a compilare (vedi i miei commenti) la fusione di SQLite. E se voglio collegarmi, gli oggetti devono essere in formato OMF, e questa è la radice del mio problema! –

1

In Windows si sta meglio con DLL. Ti fa risparmiare un sacco di mal di testa.

È in corso il lavoro sul supporto x64 che farà leva sul linker di COFF + VC. Questo spero cambierà la situazione imbarazzante.

Edit: Se davvero bisogno di librerie statiche si può provare Unilink, che è in grado di collegare OMF e file COFF insieme: ftp://ftp.styx.cabel.net/pub/UniLink

+0

Sì, questo è quello che sto usando al momento, ma non tutte le librerie supportano quelle condivise (es. Dyncall) e le dimensioni dell'applicazione salta quando si producono piccoli eseguibili (relative alle dipendenze) –

+0

aggiornato il mio post – Trass3r

+0

Unilink è sicuramente una scelta interessante ! Lo controllerò (documentazione poco dettagliata). Hai idea di quando sarà disponibile il supporto x64 per COFF? –