2013-06-07 33 views
13

Khi tôi cố gắng xây dựng phiên bản riêng của tôi về Python sử dụng:Làm thế nào để bỏ qua python địa phương khi xây dựng python từ nguồn

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

tôi thấy một số lỗi trong khi cài đặt:

/usr/bin/ld: /usr/local/lib/libpython2.7.a(abstract.o): di dời R_X86_64_32 đối với `.rodata.str1.8 'không thể được sử dụng khi tạo đối tượng được chia sẻ ; biên dịch lại với /usr/local/lib/libpython2.7.a -fPIC: không thể đọc biểu tượng: Xấu giá trị

Vấn đề bắt đầu khi mối liên kết cố gắng sử dụng /usr/local/lib/libpython2.7.a và không phải là thư viện mới được biên soạn.

Làm cách nào để ngăn chặn trình liên kết (định cấu hình/tạo) sử dụng thư viện python được cài đặt trên hệ thống?

+0

'./configure enable-chia sẻ --prefix =/app/vendor/python-dev && make && make install' hoạt động cho tôi (từ [tar-2.7.5 tarball] (http://www.python.org/ftp/python/2.7.5/Python-2.7 .5.tar.bz2) trên Ubuntu 13.04). Nếu lỗi xảy ra trong phần 'make', bạn sẽ phải bao gồm toàn bộ đầu ra từ' make'. – Aya

+0

Đây là lỗi duy nhất. Nó đơn giản lặp lại cho các mô-đun khác. Tôi đang sử dụng 2.7.4 tarball. Nhưng tôi có 2.7.4 trên máy tính của tôi, biên dịch tĩnh (tôi đoán không có -fPIC). – Xyand

+0

Chắc chắn, nhưng lý do cho lỗi sẽ xảy ra sớm hơn trong quá trình xây dựng, vì vậy không thể chẩn đoán mà không có thêm thông tin. Hãy xem [this] (http://mail.python.org/pipermail/python-list/2010-September/587427.html) và phần tiếp theo. Tôi không chắc đó có phải là vấn đề tương tự hay không, nhưng tôi không thể làm gì nhiều hơn nếu không nhìn thấy đầu ra từ 'make'. – Aya

Trả lời

12

Đây có vẻ là sự không hài lòng của tập lệnh setup.py luôn bao gồm /usr/local trong đường dẫn tìm kiếm khi make tạo mục tiêu sharedmods.

Bạn sẽ phải tự frob các setup.py, vì vậy làm ...

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

... đầu tiên, sau đó chỉnh sửa setup.py, tìm dòng 442, 443 và 444 mà sẽ trông như thế này. ..

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') 

... và bình luận chúng ra để họ trông như thế này ...

# 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') 

... thì make sẽ hoạt động.

+2

Câu lệnh if cũng cần phải được nhận xét. Nếu không phân tích cú pháp sẽ được mong đợi một khối thụt vào đó là hai dòng add_dir_to_list. Chỉ để tham khảo trong tương lai. – Xephon

+0

tôi chỉ gặp vấn đề này khi tôi đang cố gắng biên dịch lại và cài đặt lại python vào/usr/local/lib một lần nữa. Trong trường hợp này, bạn phải sử dụng lại --prefix =/usr/local/lib và chỉnh sửa setup.py, vì câu trả lời này gợi ý sẽ không hữu ích.Để khắc phục nó, tôi phải xóa tập tin /usr/local/lib/libpython2.7.a hiện có và /usr/local/lib/python2.7/ thư mục (có thể không cần đến sau này) – user920391

4

tôi giải quyết với 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

Tôi chỉ chuyển /usr/local/lib/libpython2.7.a đến/tmp

Các vấn đề liên quan