gpt4 book ai didi

c++ - gcc -L 命令困惑

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:41 24 4
gpt4 key购买 nike

假设我有一个共享库文件 libdemo.so,其中 libdemo.so 是最终链接器。

如果我想构建可执行文件,并且如果库文件在当前工作目录中,我可以使用 -L 链接它。 -ldemo 标志。

但是当我运行可执行文件时,除非我指定库路径LD_LIBRARY_PATH=.,否则可执行文件找不到链接。那么为什么需要额外的 LD_LIBRARY_PATH 设置呢?标志用于链接时库路径,环境变量应该是运行时库路径。

或者,如果我构建可执行文件并使用 -Wl,-rpath,. 指定运行时库路径,我可以省略 -L。 -ldemo.

我知道这与链接时和运行时有关,但我不清楚两者之间的区别。例如,当不使用 -rpath 时,-L. -ldemo 如果可执行文件需要 LD_LIBRARY_PATH 来查找库文件,实际上会怎么做?而在使用后一种方法时,如果指定-rpath意味着将目录位置复制到运行时库路径中,为什么这也允许-L。 -ldemo 要省略吗?

如果链接时库路径和运行时库路径不同,为什么后一种方法在构建时不需要链接时库路径?链接时库路径和运行时库路径有什么区别?

最佳答案

因为链接是由两个不同的链接器实例完成的。

当您编译和链接您的程序时,链接器如 /usr/bin/ld 检查外部引用并构建您的可执行文件添加外部引用 libdemo.so

当您运行您的程序时,运行时链接器 /lib64/ld-linux-x86-64.so.2(或通常称为 ld.so)加载所有需要的共享对象-L 没有保存的原因有几个:

  • libdemo.so 不必位于编译期间的同一路径(因为您可以将二进制文件复制到另一台主机,该路径是内部构建路径等)
  • 它可能不安全,所以 ld.so 通常会查找非 root 用户无法写入的“可信”路径列表

但是,有些情况下保存 -L 会很有用(例如,将软件安装到 /opt 中),所以 一些 Unix介绍了 RPATH。

关于c++ - gcc -L 命令困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28230983/

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