C++ 链接器错误:";根据符号“xmlFree';重新定位R_X86_64_PC32…”。。。使用-fPIC“重新编译”;但有问题的库已经用-fPIC编译过了

C++ 链接器错误:";根据符号“xmlFree';重新定位R_X86_64_PC32…”。。。使用-fPIC“重新编译”;但有问题的库已经用-fPIC编译过了,c++,linux,cmake,shared-libraries,fpic,C++,Linux,Cmake,Shared Libraries,Fpic,我正在尝试建立一个共享库。我的目标是将所有依赖项作为静态库拉入单个共享库。我的理解是,这可以通过-Wl,--wholearchive标志来完成。下面是负责配置共享库的CMake脚本的一个片段 # shared library add_library(semsim SHARED "${SEMSIM_HEADERS}" "${SEMSIM_SOURCES}") # created the shared library #fPIC for linux shared librar

我正在尝试建立一个共享库。我的目标是将所有依赖项作为静态库拉入单个共享库。我的理解是,这可以通过
-Wl,--wholearchive
标志来完成。下面是负责配置共享库的CMake脚本的一个片段

    # shared library
    add_library(semsim SHARED "${SEMSIM_HEADERS}" "${SEMSIM_SOURCES}") # created the shared library
    #fPIC for linux shared library strs
    set_property(TARGET semsim PROPERTY POSITION_INDEPENDENT_CODE ON) #turn fPIC on 
    target_compile_options(semsim PRIVATE -Wl,--whole-archive) # enable pulling static libraries into shared library
我在尝试编译时遇到的错误(详细模式处于启用状态)是:

然而,根据问题,
/usr/local/lib/lxml2.a
已经被编译成
fPIC

(base) ciaran@DESKTOP:/usr/local/lib$ ls
cmake            libcharset.so.1.0.0  libraptor2.a         librasqal.la        librdf.so        libxml2.so.2
libbz2.a         libcurlcpp.a         libraptor2.la        librasqal.so        librdf.so.0      libxml2.so.2.9.10
libcharset.a     libiconv.la          libraptor2.so        librasqal.so.3      librdf.so.0.0.0  pkgconfig
libcharset.la    libiconv.so          libraptor2.so.0      librasqal.so.3.0.0  libxml2.a        python2.7
libcharset.so    libiconv.so.2        libraptor2.so.0.0.0  librdf.a            libxml2.la       python3.6
libcharset.so.1  libiconv.so.2.6.1    librasqal.a          librdf.la           libxml2.so       xml2Conf.sh
(base) ciaran@DESKTOP:/usr/local/lib$ readelf -d libxml2.a | grep TEXT
(base) ciaran@DESKTOP:/usr/local/lib$

这让我相信,也许我误解了错误信息——有人能解释一下这里发生了什么吗

您没有误解错误消息,或者至少没有明显误解

然而,根据问题,/usr/local/lib/lxml2.a已经被编译成fPIC

您得出结论是因为命令:

/usr/local/lib$ readelf -d libxml2.a | grep TEXT
不输出任何内容,这表明您选择了 这个问题,尽管在撰写本文时,它的票数还没有达到预期的水平

我猜您这样做是因为最流行的答案告诉您如何测试对象文件的可用性 你想测试一个库,这是第二个最流行的答案。或 可能是因为您首先尝试了最流行的答案,它表明您的
libxml2.a
这是一张照片

但第二个最流行的答案是测试一个共享库,您可以使用它来测试 静态库中的对象文件。共享库与 一个对象文件,或此类文件的静态库,给出这个答案的问题是如何测试 对象文件的PIC属性。所以这个答案并没有回答这个问题:真的吗 它建议如何测试具有类似于共享库的名称的文件是否实际存在 共享图书馆

最流行的答案确实回答了这个问题,如果答案正确的话 它也将是适合您的,因为链接器诊断出:

/usr/local/lib/libxml2.a(uri.o): relocation R_X86_64_PC32 against symbol `xmlFree' \
can not be used when making a shared object; recompile with -fPIC
libxml2.a
中存档的对象文件
uri.o
不是PIC

但最流行的答案,尽管很受欢迎,却是无效的。 它提出的picness测试——没有支持性的论据——可以 将非PIC对象文件错误识别为PIC(正如您可能观察到的)

这个问题没有答案 这对你来说是一个正确的答案,为什么不重要。系统链接器本身 是关于对象文件是否独立于位置的最终权限。 除了尝试将目标文件链接到DSO之外,任何一个线性测试都只是一种尝试 猜测链接器:如果其判决与 链接器的it表示测试已中断,而不是链接器

你已经知道链接者的判决了。它试图链接
libxml2.a(uri.o)
并发现它不能,因为它包含一个非位置独立的 搬迁记录

您得到的
/usr/local/lib/libxml2.a
是基于传统的 默认假设归档在其中的对象文件不需要编译为 定位独立代码(使用
-fPIC
),因为静态库只会 输入到非位置独立可执行文件的链接。如果你想 链接一些PI二进制文件,然后将其链接到共享库
libxml2.so
, 这就是PI的定义。您的
libxml2.a
还使用编译器构建 默认情况下不发出PI对象代码的。您当前的 编译器仍然具有越来越过时的特性,但您不需要找到它 出去

您需要将本地
libxml2
install替换为对象所在的安装
libxml2
中的文件已使用
fPIC
编译。如果你已经知道怎么做了,你可以跳过剩下的部分继续做下去

如果您在某处获得了构建的
libxml2
的源程序包 并已安装,您希望继续使用该版本,然后将
cd
放入其根目录并运行:

make uninstall
./autogen.sh
否则,通过以root用户身份删除所有匹配的文件和符号链接来删除安装
/usr/local/lib/libxml2
和目录
/usr/local/include/libxml2

如果您想继续使用您已经获得的源程序包(您在其中运行了
makeuninstall
), 然后,在其根目录中运行:

make distclean
恢复其原始状态

如果您没有想要坚持使用的源代码包,请从
https://gitlab.gnome.org/GNOME/libxml2/
, 然后
cd
进入根目录并运行:

make uninstall
./autogen.sh
生成构建系统

无论到目前为止您做了什么,请在包根目录中运行:

./configure CFLAGS=-fPIC [any other non-default configuration options]
make
./configure -h
如果成功完成,则运行:

./configure CFLAGS=-fPIC [any other non-default configuration options]
make
./configure -h
如果成功完成,则作为根运行:

如果成功完成,则
/usr/local/lib/libxml2.a
将 重新创建包含PI对象文件的对象,您将能够链接 共享库反对它

如果您不确定有关的
[任何其他非默认配置选项]
单击
/configure
命令,然后运行:

./configure CFLAGS=-fPIC [any other non-default configuration options]
make
./configure -h

事先寻求帮助和/或寻求建议。

您没有误解错误消息,或者至少没有明显误解

然而,根据问题,/usr/local/lib/lxml2.a已经被编译成fPIC

您得出结论是因为命令:

/usr/local/lib$ readelf -d libxml2.a | grep TEXT
不输出任何内容,这表明您选择了 这个问题,尽管在撰写本文时,它的票数还没有达到预期的水平

我猜您这样做是因为最流行的答案告诉您如何测试对象文件的可用性 你想测试一个库,这是第二个最流行的答案。或 也许是因为你先尝试了最流行的答案,它表明你