2009-03-10 6 views
14

Sto cercando di costruire Python 2.6 per QGIS su RHEL 5. Durante le riprese di QGIS ottengo il seguente errore:Come posso impostare ccshared = -fPIC mentre eseguo ./configure?

Linking CXX shared library libqgispython.so 
/usr/bin/ld: /usr/local/lib/python2.6/config/libpython2.6.a(abstract.o): relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC 
/usr/local/lib/python2.6/config/libpython2.6.a: could not read symbols: Bad value 
collect2: ld returned 1 exit status 
make[2]: *** [src/python/libqgispython.so.1.0] Error 1 
make[1]: *** [src/python/CMakeFiles/qgispython.dir/all] Error 2 
make: *** [all] Error 2 

Quello che ho capire da questo errore è che ho bisogno di costruire con Python 2.6 qualche bandiera, -fPIC. OK, quindi l'ho trovato nel file configure.in ma controlla diverse condizioni e sulla base di tali condizioni assegna -fPIC al flag CCSHARED.

Quello che ho fatto è stato che dopo aver controllato tutte le condizioni ho aggiunto la seguente riga per usare deliberatamente CCSHARED come -fPIC.

CCSHARED="-fPIC"; 

Ma non ha funzionato ..

come specificare durante la configurazione che voglio impostare CCSHARED come -fPIC?

risposta

14

Esegui configure con --enable-shared. Quindi -fPIC sarà incluso come parte dei flag condivisi.

+4

Sfortunatamente, quando ho provato ad eseguire './configure --enable-shared', questo ha causato la mancata compilazione di molti importanti moduli built-in Python (sto cercando di compilare Python 2.7.3 per un sistema Ubuntu 11.04 a 64 bit). Invece di aggiungere '--enable-shared', ho dovuto modificare' Makefile' e aggiungere '-fPIC' dopo' CC = 'come da risposta ashishsony sotto. –

+1

Anche i miei moduli non sono riusciti a compilare, ma è perché avevo il cattivo libpython2.7a già installato in/usr/local/lib! Cancellato quello e reran 'make', e tutto era felice. –

+0

Stavo installando su linux scientifico 6.4 usando i moduli di ambiente. Ho dovuto cancellare l'installazione precedente –

0

Non è quello CCFLAGS? (Non sono stati in quella parte del mondo per un po '.)

3
  1. Run ./configure --help, possibilmente tubazioni a grep PIC, per vedere se c'è un opzione per abilitare questa
  2. provare a impostare la variabile d'ambiente prima di eseguire configure , per esempio CCSHARED = - ./configure (come un singolo comando, assumendo bash)

Se nessuno di questi lavori, è necessario leggere il codice di configurazione e comprendere le condizioni che i test per una migliore "fPIC".

6

ho ottenuto che funziona con l'aggiunta di -fPIC dopo CC= gcc -pthread, cioè CC= gcc -pthread -fPIC nel Makefile.

+0

su CentOS 6.5, la compilazione di Python -2.7.5 con './configure --enable-shared' ha provocato un errore:' '.rodata.str1.8' non può essere usato quando si crea un oggetto condiviso; ricompilare con -fPIC'. Ho dovuto modificare il Makefile e aggiungere -fPIC alla variabile come descritto. Ciò lo ha risolto, ma mi dispiace che dovessi farlo, ma la compilazione su altre macchine con Mac e Ubuntu non ha mai avuto questo problema, indagherò ulteriormente se avrò il tempo. – lukecampbell

0

Come indicato altrove, l'esecuzione di configure con --enable-shared dovrebbe causare l'inclusione di -fPIC nei flag del compilatore. Tuttavia, potresti ancora vedere l'errore "Impossibile leggere i simboli" se provi a creare una build parallela utilizzando, ad esempio, "make -j8". Ho avuto lo stesso errore su RHEL 5.2 ed è andato via solo quando ho rimosso il '-j8' dall'invocazione make ...

+0

Solo secondando la risposta di evadeflow: dovrebbe usare --enable-shared, e se ciò non è sufficiente, costruire usando solo un thread (nessuna opzione -j). Ho trovato la seconda parte necessaria su un computer 5.7 di Scientific Linux SLF release durante l'installazione di Python 2.7.2. –

+0

Trovo che se costruisci Python prima senza configurare per '--enable-shared', provare a farlo successivamente causerà un errore epico poichè la lib static sarà nel path, ma il makefile sta chiaramente cercando qualcos'altro –

0

ricostruito il openssl con ./config --prefix =/software/bea/openssl/100c --openssldir =/software/bea/openssl/100c/ssl condiviso -fPIC

e quindi funziona anche a dint. ha dato/usr/bin/ld: link falliti. Abbiamo modificato la parte di collegamento nel file make precedentemente era gcc -Wall -shared -o pwutil.so asciihex.o base64.o bitutils.o dict.o gen_rand.o key_schedule.o md5c.o pdg2_ecb.o pwutils. o random_data.o hexutils.o des3crypt.o blowcrypt.o /software/bea/openssl/1.0.0c/lib/libcrypto.a

abbiamo cambiato libcrypto.a in libcrypto.so dopo la ricostruzione con l'opzione condivisa e - fPIC

gcc -Wall -o -shared pwutil.so asciihex.o base64.o bitutils.o dict.o gen_rand.o key_schedule.o md5c.o pdg2_ecb.o pwutils.o random_data.o hexutils.o des3crypt.o blowcrypt.o /software/bea/openssl/1.0.0c/lib/libcrypto.così

e ha funzionato

3

Di seguito ha lavorato per me quando mi sono imbattuto in questo errore:

make clean 
./configure CFLAGS=-fPIC CXXFLAGS=-fPIC 
+0

è stata l'unica risposta che ha funzionato per me. –

+0

@FishBiscuit fantastico! per favore apri gli spettatori per mostrare agli spettatori futuri che questa risposta potrebbe funzionare per loro. – Crt