如何使用-fPIC标志重新编译libperl.a目标文件?

时间:2017-04-04 09:36:57

标签: perl

在尝试修复某些installation problems时出现了这个问题  与QtCore4。在某些时候make尝试运行以下命令:

/usr/bin/c++  -fPIC -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong \
 -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O3 -DNDEBUG  \
 -shared -Wl,-soname,QtCore4.so -o ../../blib/arch/auto/QtCore4/QtCore4.so \
 CMakeFiles/perlqtcore4.dir/binding.cpp.o \
 CMakeFiles/perlqtcore4.dir/handlers.cpp.o \
 CMakeFiles/perlqtcore4.dir/marshall_types.cpp.o \
 CMakeFiles/perlqtcore4.dir/util.cpp.o \
 CMakeFiles/perlqtcore4.dir/QtCore4.c.o \
 -lQtCore -lQtGui -lQtNetwork \
 /home/hakon/perlbrew/perls/perl-5.24.1/lib/5.24.1/x86_64-linux/CORE/libperl.a \
 ../../smokeqt/qtgui/libsmokeqtgui.so.3.0.0 \
 ../../smokeqt/qtnetwork/libsmokeqtnetwork.so.3.0.0 \
 -lpthread -lnsl -ldl -lm -lcrypt -lutil -lc -lQtGui -lQtNetwork \
 ../../smokeqt/qtcore/libsmokeqtcore.so.3.0.0 -lQtCore \
 ../../smokegen/bin/libsmokebase.so.3.0.0 \
 -Wl,-rpath,/home/hakon/Qt4-0.99.0/smokeqt/qtgui:/home/hakon/Qt4-0.99.0/smokeqt/qtnetwork:/home/hakon/Qt4-0.99.0/smokeqt/qtcore:/home/hakon/Qt4-0.99.0/smokegen/bin: 

因链接器出现以下错误消息而失败:

/usr/bin/ld: /home/hakon/perlbrew/perls/perl-5.24.1/lib/5.24.1/x86_64-linux/CORE/libperl.a(toke.o): 
  relocation R_X86_64_PC32 against symbol `PL_curcop' can not be used when making
  a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
collect2: error: ld returned 1 exit status

从错误消息中,在我看来,目标文件(此处为:toke.o)中 编译libperl.a时未设置-fPIC标志。

我现在的问题是:

  • 如何使用libperl.a
  • 重新编译-fPIC中的目标文件
  • 此重新编译是否会导致与其无关的其他问题 QtCore4(因为libperl.a可能会被使用(链接 with)与QtCore4无关的其他应用程序/程序?

我使用的是Ubuntu 16.10和perl版本5.24.1。

1 个答案:

答案 0 :(得分:2)

  

如何使用-fPIC

重新编译libperl.a中的目标文件

通过使用-fPIC标志重新编译libperl.a。

./Configure -des -Accflags=-fPIC ...
  

这次重新编译是否会导致与QtCore4无关的其他问题(因为很可能libperl.a将被与QtCore4无关的其他应用程序/程序使用(链接))?

是。首选共享libperl。的 -Duseshrplib

将perl嵌入共享库时需要使用哪个。你可以取消ELF所需的-fPIC技巧,但共享的libperl使它更容易。