我做了一个格式化存储设备的程序。但是,当我基于这个程序创建库(用于python GUI)时,它开始显示错误:
/usr/bin/ld: fdisk/libfdisk.a(la-label.o): relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
我使用的libfdisk.a是从源代码util-linux-2.35
构建的,当使用-lfdisk
而不是libfdisk.a
时,编译时没有错误。
编译出错:
g++ file1.cpp file2.cpp ... -o package.name ... libfdisk.a
正确编译:
g++ file1.cpp file2.cpp ... -o package.name ... -lfdisk
这两种方式有什么区别?
但是还有一个关于fdisk的可选问题。当我用-lfdisk
编译我的程序(不是库)时,程序不能创建2个分区,因为错误28(从fdisk_add_partition(...)返回)。如果需要,我会分享代码。
1条答案
按热度按时间t5zmwmid1#
使用
-lfdisk
时,链接器会被要求确定到底要使用哪个库文件。Linux上常用的链接器将前缀
lib
,然后搜索以库路径结尾的.so
或.a
文件,因为您没有指定任何库路径,所以库路径将是系统库路径(可能是/usr/lib/
或类似路径)。如果找到.so
,则在没有请求静态链接的情况下,将首选它进行链接。另一种方法是显式地添加当前目录中名为
libfdisk.a
的文件。这是一个静态库,不是共享库,如果您试图从它构建共享库,那么您需要使用-fPIC
编译libfdisk.a
,或者如果您试图构建PIE可执行文件,则至少使用-fPIE
。如果您试图构建非PIE可执行文件,则两个标志都不需要。GCC可以被配置为默认地构建PIE(作为硬化措施)。因此,您可能链接了两个完全不同的文件。