3

我正在用 g++ 编译 C++ 静态库并使用 -fPIC 选项。我必须使用 -fPIC 选项,因为最终该库将与其他静态库链接以形成动态库。

当我在本地测试静态库时,当我不包含 -fPIC 选项时它工作得很好。但是,当我使用 -fPIC 编译库时,在调用其中一个函数时,我会在运行时收到分段错误错误。

包括 -fPIC 来编译静态库的哪些原因会导致运行时出现分段错误?

4

1 回答 1

5

动态库应该在运行时加载,因此不能有位置相关的代码。

另一方面,静态库只是目标文件的存档。

与动态库链接时,链接器在可执行文件中添加库的名称,以便加载器在加载程序时加载它。当链接器与静态库链接时,它基本上提取目标文件并像任何其他目标文件一样与它们链接。

因此,除非您创建一个所有其他目标文件与位置无关的可执行文件(您-fPIC用于程序代码),否则您无法链接到使用与位置无关代码的静态库,生成的可执行文件根本没有设置为它。

于 2016-06-15T17:36:54.717 回答