C语言 直接链接libfdisk. a与通过-lfdisk链接libfdisk. a之间的区别

vbopmzt1  于 2022-12-29  发布在  其他
关注(0)|答案(1)|浏览(107)

我做了一个格式化存储设备的程序。但是,当我基于这个程序创建库(用于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(...)返回)。如果需要,我会分享代码。

t5zmwmid

t5zmwmid1#

使用-lfdisk时,链接器会被要求确定到底要使用哪个库文件。
Linux上常用的链接器将前缀lib,然后搜索以库路径结尾的.so.a文件,因为您没有指定任何库路径,所以库路径将是系统库路径(可能是/usr/lib/或类似路径)。如果找到.so,则在没有请求静态链接的情况下,将首选它进行链接。
另一种方法是显式地添加当前目录中名为libfdisk.a的文件。这是一个静态库,不是共享库,如果您试图从它构建共享库,那么您需要使用-fPIC编译libfdisk.a,或者如果您试图构建PIE可执行文件,则至少使用-fPIE。如果您试图构建非PIE可执行文件,则两个标志都不需要。GCC可以被配置为默认地构建PIE(作为硬化措施)。
因此,您可能链接了两个完全不同的文件。

相关问题