كيف يمكنني ضبط ccshared = -fpic أثناء التنفيذ ./configure؟
سؤال
أحاول بناء بيثون 2.6 QGIS على ريل 5. أثناء صنع QGIS أحصل على الخطأ التالي:
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
ما اكتشفته من هذا الخطأ هو أنني بحاجة إلى بناء Python 2.6 مع بعض العلم ، -fPIC
. حسنًا ، لقد وجدته في configure.in
ملف لكنه يتحقق من عدة شروط وعلى أساس تلك الشروط التي يعينها -fPIC
إلى CCSHARED
علَم.
ما فعلته هو أنه بعد فحص جميع الظروف ، أضفت السطر التالي لاستخدامه عمدا CCSHARED
كما -fPIC
.
CCSHARED="-fPIC";
ولكنها لم تعمل..
كيفية تحديد أثناء تكوين ما أريد ضبطه CCSHARED
كما -fPIC
?
المحلول
تشغيل التكوين مع --enable-shared
. ثم -fPIC
سيتم تضمينها كجزء من الأعلام المشتركة.
نصائح أخرى
ما يلي عمل بالنسبة لي عندما واجهت هذا الخطأ:
make clean
./configure CFLAGS=-fPIC CXXFLAGS=-fPIC
لقد حصلت عليها من خلال الإضافة -fPIC
بعد، بعدما CC= gcc -pthread
, ، بمعنى آخر CC= gcc -pthread -fPIC
في Makefile.
- يجري
./configure --help
, ، ربما الأنابيب إلى grep pic ، لمعرفة ما إذا كان هناك خيار لتمكين هذا - حاول تعيين متغير البيئة قبل تشغيل التكوين ، على سبيل المثال ccshared = "-fpic" ./Configure (كأمر واحد ، على افتراض bash)
إذا لم يكن أي من هذه الأعمال ، فأنت بحاجة إلى قراءة رمز تكوين وفهم الشروط التي يختبرها بشكل أفضل.
كما هو مذكور في مكان آخر ، يجب أن يتسبب تشغيل التكوين باستخدام -المشتركة القابلة للتنفيذ -في إدراجها في أعلام التحويل البرمجي. ومع ذلك ، لا يزال بإمكانك رؤية خطأ "لا يمكن قراءة الرموز" إذا حاولت القيام ببناء متوازي باستخدام ، على سبيل المثال ، "Make -J8". كان لدي هذا الخطأ نفسه في RHEL 5.2 وذهب بعيدًا فقط عندما أزلت "-J8" من استدعاء Make ...
أليس هذا CCFLAGS
؟ (لم يكن هذا الجانب من العالم لفترة من الوقت.)
أعيد بناء OpenSSL باستخدام ./config -prefix =/software/bea/openssl/100c -openssldir =/software/bea/openssl/100c/ssl مشترك
ثم أيضا العمل. أعطى/usr/bin/ld: فشل الروابط. قمنا بتعديل الجزء الرابط في ملف Make سابقًا ، كان GCC -wall -sare -o -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
قمنا بتغيير libcrypto.a إلى libcrypto.so بعد إعادة البناء مع خيار مشترك و - fpic
gcc -wall -sared -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 / البرمجيات/BEA/OPENSSL/1.0.0C/LIB/LIBCRYPTO.SO
وعملت
فيما يلي مثال من تمرير FPIC لتكوين