2013-06-07 11 views
13

Kiedy próbuję zbudować własną wersję Pythona przy użyciu:Jak ignorować lokalnego Pythona przy budowie pytona ze źródła

./configure --enable-shared --prefix=/app/vendor/python-dev && make && make install 

widzę jakieś błędy podczas instalacji:

/usr/bin/ld: /usr/local/lib/libpython2.7.a(abstract.o): relokacja R_X86_64_32 względem `.rodata.str1.8 'nie może być używana podczas tworzenia obiektu wspólnego ; przekompilować z -fPIC /usr/local/lib/libpython2.7.a: nie mógł odczytać symbole: Bad wartość

Problem zaczyna się, gdy łącznik próbuje użyć /usr/local/lib/libpython2.7.a a nie nowo skompilowane biblioteki.

Jak mogę zapobiec użyciu przez linker (configure/make) bibliotek Pythona zainstalowanych w systemie?

+0

'./configure --enable-shared prefix =/app/vendor/python-dev && make && make install' działa dla mnie (z [Python-2.7.5 archiwum] (http://www.python.org/ftp/python/2.7.5/Python-2.7 .5.tar.bz2) na Ubuntu 13.04). Jeśli błąd wystąpi podczas części 'make', musisz dołączyć pełne wyjście z' make'. – Aya

+0

To jest jedyny błąd. Po prostu powtarza się również dla innych modułów. Używam tarballa 2.7.4. Ale mam 2.7.4 na moim komputerze, skompilowany statycznie (chyba bez -fPIC). – Xyand

+0

Oczywiście, ale przyczyna błędu wystąpiła dużo wcześniej w kompilacji, więc niemożliwe jest zdiagnozowanie bez dodatkowych informacji. Spójrz na [this] (http://mail.python.org/pipermail/python-list/2010-September/587427.html) i obserwacje. Nie jestem pewien, czy to ten sam problem, ale niewiele więcej mogę zrobić bez zobaczenia wyjścia z 'make'. – Aya

Odpowiedz

12

Wygląda to być misfeature skryptu setup.py zawsze tym /usr/local w ścieżce wyszukiwania po make buduje cel sharedmods.

Będziesz musiał ręcznie FROB się setup.py tak zrobić ...

./configure --enable-shared --prefix=/app/vendor/python-dev 

..., potem edytować setup.py, znaleźć linie 442, 443 i 444, które powinny wyglądać następująco. ..

if not cross_compiling: 
    add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') 
    add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') 

... i komentować je więc wyglądać następująco ...

# if not cross_compiling 
    # add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') 
    # add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') 

... wtedy powinien działać make.

+2

Instrukcja if również musi zostać skomentowana. Inaczej parser oczekiwałby wcięcia bloku, który jest dwoma liniami add_dir_to_list. Tylko na przyszłość. – Xephon

+0

Właśnie napotkałem ten problem, gdy próbowałem ponownie skompilować i ponownie zainstalować python do/usr/local/lib ponownie. W tym przypadku musisz ponownie użyć --prefix =/usr/local/lib i edytować plik setup.py, ponieważ sugerowana odpowiedź nie pomoże.Aby to naprawić, musiałem usunąć istniejący plik /usr/local/lib/libpython2.7.a i /usr/local/lib/python2.7/ (może nie jest potrzebny drugi) – user920391

4

Rozwiązałem z this script:

# Python 2.7.6: 
wget http://python.org/ftp/python/2.7.6/Python-2.7.6.tar.xz 
tar xf Python-2.7.6.tar.xz 
cd Python-2.7.6 
./configure --prefix=/usr/local --enable-unicode=ucs4 --enable-shared  LDFLAGS="-Wl,-rpath /usr/local/lib" 
make && make altinstall 
0

prostu przeniósł /usr/local/lib/libpython2.7.a do/tmp

Powiązane problemy