使用 make returns 错误编译库 - 使用 -fPIC 重新编译(没有 ./configure 文件)

Compiling library with make returns error - recompile with -fPIC (no ./configure file)

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

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

进展顺利。当我必须使用 make 时,问题就出现了。 运行 之后出现以下错误:

/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

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

由于我们已经在评论区找到了解决方案,所以我会抽空给你一个正确的答案来澄清情况。

首先,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/