【问题标题】:Compiling library with make returns error - recompile with -fPIC (no ./configure file)使用 make 编译库返回错误 - 使用 -fPIC 重新编译(没有 ./configure 文件)
【发布时间】:2018-08-13 20:26:13
【问题描述】:

我正在尝试从 KDE (here) 编译 KArchive。显然,我正在按照他们在安装文件中的说明进行操作。首先一切顺利,我只需要创建一个名为 build 的目录并在其中使用:

cmake .. \
  -DCMAKE_BUILD_TYPE=debug \
  -DCMAKE_INSTALL_PREFIX=/usr/local

进展顺利。当我必须使用 ma​​ke 时出现问题。运行后出现以下错误:

/usr/bin/ld: /usr/local/lib/libbz2.a(bzlib.o): relocation R_X86_64_32S against symbol BZ2_crc32Table can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libbz2.a(compress.o): relocation R_X86_64_32 against .rodata.str1.1 can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libbz2.a(decompress.o): relocation R_X86_64_32S against .rodata can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: /usr/local/lib/libbz2.a(blocksort.o): relocation R_X86_64_32 against .rodata.str1.1 can not be used when making a shared object; recompile with -fPIC

现在,这个问题并不少见,但大多数解决方案都对我不起作用。

【问题讨论】:

  • 您尝试过哪些解决方案?错误消息是明确的,您不能使用静态库.a 创建共享库.so。你电脑上locate libbz2 的输出是什么?
  • 一些解决方案据说在运行 ./configure 时使用 --enable-shared,但我没有配置文件。我还尝试在 makefile 中设置 CXXFLAGS=-fPIC 但没有帮助。定位的输出是: /usr/lib/libbz2.so.1 /usr/lib/libbz2.so.1.0.6 /usr/lib64/libbz2.so /usr/lib64/libbz2.so.1 /usr/lib64 /libbz2.so.1.0.6 /usr/lib64/qt5/plugins/kerfuffle/kerfuffle_libbz2.so /usr/local/lib/libbz2.a
  • 由于您拥有/usr/lib/libbz2.so.1,因此您不必使用-fPIC 标志重新编译您的库。您显然必须更正共享库,但您的链接器使用了错误的库。您可以尝试将 -DCMAKE_LIBRARY_PATH=/usr/lib/ 标志添加到您的 Cmake 命令中,看看是否有任何变化?
  • 是的,这行得通。谢谢。

标签: makefile cmake fpic


【解决方案1】:

由于我们已经在 cmets 部分找到了解决方案,所以我需要时间给您一个正确的答案以澄清情况。

首先,CMake 是生成 MakeFile 的绝佳工具。您可以在项目的根目录中看到一个 CMakeLists.txt 文件,您可以在其中配置编译项目所需的所有内容。

然后你创建并进入你的构建目录,输入命令cmake .. -DCMAKE_BUILD_TYPE=debug -DCMAKE_INSTALL_PREFIX=/usr/local。命令行中的 .. 是您拥有项目的主要 CMakeLists.txt 的路径。可以使用-DFLAG_NAME=value 添加其他标志。

在您的情况下,当您使用make 编译时,问题是您的链接器使用静态库而不是动态库来生成动态库(这是错误消息)。

您的编译器建议使用 -fPIC 标志(位置无关代码)重新编译 bz2 库。

使用命令locate libbz2,您告诉我您的计算机上有/usr/lib/libbz2.so.1,所以问题只是库路径问题。

为了添加这个库的路径,你有一个 CMake 标志,因此,以下命令可以解决你的问题:

cmake .. -DCMAKE_BUILD_TYPE=debug -DCMAKE_INSTALL_PREFIX=/usr/local -DCMAKE_LIBRARY_PATH=/usr/lib/

【讨论】:

    猜你喜欢
    • 2013-08-25
    • 2015-01-18
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多