我正在尝试从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
现在,这个问题并不少见,但是大多数解决方案都不适用于我。
答案 0 :(得分:1)
由于我们已经在评论部分找到了解决方案,因此我花时间给您一个适当的答案以澄清情况。
首先,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/