gpt4 book ai didi

c - linux 链接器/加载器搜索顺序

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:03 26 4
gpt4 key购买 nike

这个问题与在编译和动态链接期间查找库的方式有关。

考虑这个小项目:

  • 项目
    • 利巴
      • a.hpp
      • a.cpp
    • 图书馆
      • b.hpp
      • b.cpp
    • main.cpp

a.hpp:

int AAA();

a.cpp:

#include <b.hpp>

int AAA()
{
return BBB();
}

b.hpp:

int BBB();

b.cpp:

int BBB()
{
return 3;
}

主要.cpp:

#include "liba/a.hpp"
#include "libb/b.hpp"

int main()
{
AAA();
BBB();
}

libb 编译为:

cd libb; g++ -shared -o libb.so b.cpp

liba 编译为:

cd liba; g++ -I../libb/ -L../libb/ -lb -shared -o liba.so -Wl,-rpath /full/path/to/project/libb/ a.cpp

main 编译为:

g++ -Lliba -la -Wl,-rpath /full/path/to/project/liba/ main.cpp

编译没有报错,但是执行a.out时找不到libb.so。

ldd 输出:

ldd ./a.out 
linux-gate.so.1 => (0xffffe000)
liba.so => /full/path/to/project/liba/liba.so (0xb780a000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0xb76ba000)
libm.so.6 => /lib/libm.so.6 (0xb7692000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7672000)
libc.so.6 => /lib/libc.so.6 (0xb750f000)
libb.so => not found
libb.so => /full/path/to/project/libb/libb.so (0xb750c000)
/lib/ld-linux.so.2 (0xb780e000)

请注意,libb.so 出现了两次。有一次动态链接器找不到库,有一次找到了。我假设,在第二种情况下,它使用嵌入在 liba.so 中的 rpath。

当然,有多种方法可以解决该问题(例如 LD_LIBRARY_PATH,在编译 main.cpp 时嵌入正确的 rpath...),但我更感兴趣的是为什么 main.cpp 的编译有效,而动态链接没有。

到目前为止,我假设使用相同的过程来搜索所需的库。有什么我想念的东西,或者我不知道的一些隐藏的魔法吗? :)

(在带有 gcc 4.3.4 的 SLED11 盒子上测试。)

最佳答案

没有隐藏的魔法,但您基本上已经向编译器 promise ,您将在运行时告诉加载程序在哪里可以找到这些函数,但您没有这样做。从 AAA 调用的 BBB 知道如何到达那里,但从 main 调用的 BBB 不知道。

关于c - linux 链接器/加载器搜索顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7571131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com