gpt4 book ai didi

c++ - 我可以指定我的可执行文件链接到一个或其他库吗? libhello.so 还是 libhellod.so?

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

我有我的项目设置,如果我进行发布构建,那么我会得到名为 libhello.so 的库如果它是调试版本,我会得到类似 libhellod.so 的名称- 注意 d在名字的末尾。

所以当我编译和链接一个应用程序/可执行文件时,我会做类似的事情:

gcc -g -o myapp obj1 obj2 obj3 -lhellod

我在这里将它链接到调试库。现在我可以使用它的库部署这个应用程序:

  • myapp
  • libhellod.so

很好,但后来我们决定要生成 hello 库的发布版本,并使用应用程序而不是调试版本进行部署。现在它提示找不到名为 hellod 的库.好的,所以我可以做一个符号链接(symbolic link):

  • myapp
  • libhello.so
  • libhellod.so -> libhello.so

这也行。

我能否以某种方式链接我的可执行文件,以便它可以找到 libhello.solibhellod.so (不使用符号链接(symbolic link))? - 或者符号链接(symbolic link)是实现这一目标的唯一方法吗?还是我的设计太傻了?!

最佳答案

不,你不能。

但是您可能对 LD_PRELOAD 环境变量感兴趣。它允许您在可执行文件中指定的所有其他库之前强制加载一个库。

当链接器按顺序处理库时,如果您LD_PRELOAD=libhellod.so yourprogram,它应该使libhellod.so覆盖libhello.so<中的符号。这不会阻止 libhello.so 被加载——例如它的初始化部分将被运行。使用 LD_DEBUG=bindings 检查结果。

你可以得到同样的效果编辑/etc/ld.so.preload

查看 ld.so 的文档.

另外,仅仅因为你可以并不意味着它是一个好的设计——要特别小心可能被内联的函数和类似的东西;但如果版本之间的唯一区别是几个日志记录和断言,你应该没问题。

关于c++ - 我可以指定我的可执行文件链接到一个或其他库吗? libhello.so 还是 libhellod.so?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56054614/

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