这个问题是在尝试修复一些安装问题时出现
的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:
Run Code Online (Sandbox Code Playgroud)
失败,来自链接器的以下错误消息:
/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
Run Code Online (Sandbox Code Playgroud)
从错误信息,在我看来,该目标文件(这里toke.o)在
libperl.a被编译时-fPIC标志设置。
我现在的问题是:
libperl.a用-fPIC?QtCore4(因为它很可能libperl.a会被与 无关的其他应用程序/程序使用(链接)QtCore4)?我使用的是 Ubuntu 16.10 和 perl 版本 5.24.1。
如何使用 -fPIC 重新编译 libperl.a 中的目标文件
通过使用 -fPIC 标志重新编译 libperl.a。
./Configure -des -Accflags=-fPIC ...
Run Code Online (Sandbox Code Playgroud)
此重新编译是否会导致与 QtCore4 无关的其他问题(因为 libperl.a 可能会被与 QtCore4 无关的其他应用程序/程序使用(链接))?
是的。更喜欢共享的 libperl。-Duseshrplib
将 perl 嵌入到共享库中时需要它。您可以取消 ELF 上所需的 -fPIC 技巧,但共享的 libperl 使其变得更加容易。