2010-06-25 10 views
25

Quando provo a compilare una copia del mio progetto sul mio computer locale, viene visualizzato un errore che indica che sta saltando le librerie incompatibili. Questo non è il caso quando sto scherzando con la versione live ospitata sul server al lavoro [lo fa perfettamente lì].Salta le librerie incompatibili alla compilazione

Vari altri siti mi hanno portato a credere che questo potrebbe essere un problema di ambiente, poiché sto sviluppando su una distribuzione a 64 bit di Ubuntu e presumo che la versione del server sia in esecuzione su 32 bit. Tuttavia, dopo aver impostato le mie variabili di ambiente per:

CFLAGS+=" -m32" 
CXXFLAGS+=" -m32" 

ho ancora ricevere lo stesso errore di compilazione di:

/usr/bin/ld: skipping incompatible /dvlpmnt/libPI-Http.a when searching for -lPI-Http 

può haz tutorial?

== Modifica ==

Questa è stata l'uscita ho ricevuto quando ho seguito il consiglio di Jonathan:

http.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped 

A quanto pare, la libreria in questione è a 32 bit, dopo tutto?

+1

Questa libreria è decisamente a 32 bit? Prova 'file/dvlpmnt/libPI-Http.a' – Rup

+0

@Rup: probabilmente dirà" archivio ar corrente ", che non è terribilmente utile. Devi ottenere un file all'interno dell'archivio, come mostrato nella mia risposta. –

+0

Si prega di inviare la riga di comando del linker ... hai ragione, sembra che la libreria sia a 32 bit, ma forse il linker è alla ricerca di librerie a 64 bit, nonostante quello che pensavi avessi fatto. –

risposta

28

Quel messaggio non è in realtà un errore - è solo un avvertimento che il file in questione non è dell'architettura corretta (ad esempio, a 32 bit contro 64 bit, architettura CPU errata). Il linker continuerà a cercare una libreria del tipo giusto.

Naturalmente, se si sta anche ottenendo un errore lungo le linee di can't find lPI-Http allora avete un problema :-)

E 'difficile suggerire ciò che il rimedio esatto sarà senza conoscere i dettagli del vostro sistema di compilazione e makefile, ma qui sono un paio di colpi al buio:

  1. solo per verificare: di solito si dovrebbe aggiungere bandiere a CFLAGS piuttosto che CTAGS - sei sicuro che questo è corretta? (Quello che hai potrebbe essere corretto - questo dipenderà dal tuo sistema di costruzione!)
  2. Spesso la bandiera deve essere passato al linker troppo - quindi potrebbe anche essere necessario modificare LDFLAGS

Se questo non aiuta - si può inviare l'output di errore completo, più il comando effettivo (es. gcc foo.c -m32 -Dxxx ecc. che era in esecuzione?

+1

Mi dispiace, hai ragione. Ho usato CFLAGS invece di CTAGS: P –

+0

Oltre a questa soluzione, puoi aggiungere '-Wl, - no-warn-search-mismatch' al tuo' CFLAGS', quindi questi avvisi vengono soppressi. –

9

Normalmente, questo non è un errore di per sé; è un avviso che il primo file trovato che corrisponde all'argomento -lPI-Http per il compilatore/linker non è valido. L'errore si verifica quando non è possibile trovare altre librerie con il contenuto giusto.

Quindi, è necessario verificare se /dvlpmnt/libPI-Http.a è una libreria di file oggetto a 32 bit o di file oggetto a 64 bit - sarà probabilmente 64-bit se si sta compilando con l'opzione -m32. Quindi è necessario stabilire se esiste un file libPI-Http.a o libPI-Http.so alternativo da qualche altra parte a 32 bit. In tal caso, assicurarsi che la directory che lo contiene sia elencata in un argomento -L/some/where per il linker. In caso contrario, sarà necessario ottenere o creare una versione a 32 bit della libreria da qualche parte.

Per stabilire ciò che è in quella biblioteca, potrebbe essere necessario fare:

mkdir junk 
cd junk 
ar x /dvlpmnt/libPI-Http.a 
file *.o 
cd .. 
rm -fr junk 

Il 'file' passo ti dice che tipo di file oggetto sono nell'archivio. Il resto fa in modo che non si crei un disastro che non possa essere facilmente ripulito.

+1

Huh, questo è strano, questo passo ora mi mostra che tutte le Librerie in questione sono, in effetti, a 32 bit. o__o –

+1

@defaultstring: Qual è la riga di comando di collegamento effettiva? Include il flag '-m32'? Aggiungilo come informazione extra nella domanda, piuttosto che come commento extra qui, per favore. –

Problemi correlati