2009-03-10 30 views
14

Tôi cố gắng để xây dựng Python 2.6 cho QGIS trên RHEL 5. Trong quá trình làm QGIS tôi nhận được lỗi sau:Làm thế nào tôi có thể đặt ccshared = -fPIC trong khi thực thi ./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 

Những gì tôi hình dung ra từ lỗi này là tôi cần phải xây dựng Python 2.6 với một số cờ, -fPIC. OK, vì vậy tôi tìm thấy nó trong tệp configure.in nhưng nó kiểm tra một số điều kiện và dựa trên các điều kiện đó, nó gán -fPIC cho cờ CCSHARED.

Điều tôi đã làm là sau khi đã kiểm tra tất cả các điều kiện, tôi đã thêm dòng sau để cố ý sử dụng CCSHARED làm -fPIC.

CCSHARED="-fPIC"; 

Nhưng nó đã không làm việc ..

Làm thế nào để xác định trong khi cấu hình mà tôi muốn thiết lập CCSHARED như -fPIC?

Trả lời

14

Chạy cấu hình bằng - có thể chia sẻ. Sau đó, -fPIC sẽ được đưa vào như một phần của lá cờ được chia sẻ.

+4

Thật không may, khi tôi thử chạy './configure --enable-shared', điều này gây ra nhiều mô-đun tích hợp Python quan trọng để không biên dịch được (tôi đang cố gắng biên dịch Python 2.7.3 cho hệ thống 64 bit Ubuntu 11.04). Thay vì thêm '--enable-shared', tôi phải chỉnh sửa' Makefile' và thêm '-fPIC' sau' CC = 'theo câu trả lời của ashishsony bên dưới. –

+1

Mô-đun của tôi cũng không thể xây dựng được, nhưng đó là vì tôi đã cài đặt libpython2.7a xấu vào/usr/local/lib! Xóa nó và chạy lại 'make', và mọi thứ đều hạnh phúc. –

+0

Tôi đã cài đặt trên linux khoa học 6.4 bằng cách sử dụng mô-đun môi trường. Tôi đã phải xóa installaiton trước –

0

Đó không phải là CCFLAGS? (Chưa được rằng bên của thế giới trong một thời gian.)

3
  1. Run ./configure --help, có thể đường ống để grep PIC, để xem nếu có một tùy chọn để kích hoạt tính năng này
  2. Hãy thử thiết lập biến môi trường trước khi chạy configure , ví dụ CCSHARED = "- fPIC" ./configure (như một lệnh duy nhất, giả sử bash)

Nếu không có công việc nào, bạn cần phải đọc mã cấu hình và hiểu các điều kiện nó kiểm tra tốt hơn.

6

Tôi đã làm việc này bằng cách thêm -fPIC sau CC= gcc -pthread, tức là CC= gcc -pthread -fPIC trong Makefile.

+0

On CentOS 6.5, biên dịch Python -2.7.5 với './configure --enable-shared' dẫn đến lỗi: '' .rodata.str1.8 'không thể được sử dụng khi tạo một đối tượng chia sẻ; biên dịch lại với -fPIC'. Tôi đã phải chỉnh sửa Makefile và thêm -fPIC vào biến như mô tả. Điều này cố định nó nhưng nó lỗi tôi rằng tôi đã phải làm điều này, nhưng biên dịch trên các máy khác với Mac và Ubuntu không bao giờ có vấn đề này, tôi sẽ điều tra thêm nếu tôi có thời gian. – lukecampbell

0

Như đã lưu ý ở nơi khác, việc chạy cấu hình với --enable-shared nên làm cho -fPIC được đưa vào cờ trình biên dịch. Tuy nhiên, bạn vẫn có thể thấy lỗi "không thể đọc biểu tượng" nếu bạn cố gắng tạo một bản dựng song song bằng cách sử dụng, ví dụ: 'make -j8'. Tôi đã có lỗi này tương tự trên RHEL 5.2 và nó chỉ biến mất khi tôi gỡ bỏ '-j8' từ lời kêu gọi của tôi ...

+0

Chỉ cần trả lời câu trả lời của evadeflow: nên sử dụng --enable-shared, và nếu điều đó không đủ, xây dựng chỉ sử dụng một luồng (không có tùy chọn -j). Tôi tìm thấy phần thứ hai cần thiết trên một máy tính SLF phát hành Linux SLF khoa học 5.7 khi cài đặt Python 2.7.2. –

+0

Tôi thấy rằng nếu bạn xây dựng python đầu tiên mà không cấu hình cho '--enable-shared', cố gắng làm như vậy sau đó sẽ gây ra sử thi thất bại như lib tĩnh sẽ được trong đường dẫn, nhưng makefile rõ ràng đang tìm kiếm cái gì khác –

0

xây dựng lại openssl với ./config --prefix =/software/bea/openssl/100c --openssldir =/software/bea/openssl/100c/ssl được chia sẻ -fPIC

và sau đó nó cũng hoạt động. nó đã cho/usr/bin/ld: các liên kết không thành công. Chúng tôi đã sửa đổi phần liên kết trong tạo tệp trước đó là 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

chúng tôi đã thay đổi libcrypto.a thành libcrypto.so sau khi xây dựng lại với tùy chọn dùng chung và - fPIC

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.nên

và nó làm việc

3

Sau đây làm việc cho tôi khi tôi chạy vào lỗi này:

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

là câu trả lời duy nhất có hiệu quả đối với tôi. –

+0

@FishBiscuit tuyệt vời! vui lòng tăng lên để cho người xem trong tương lai biết rằng câu trả lời này có thể phù hợp với họ. – Crt

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