【问题标题】:With gcc is it possible to link library but only if it exists?使用 gcc 是否可以链接库,但前提是它存在?
【发布时间】:2018-10-31 14:18:26
【问题描述】:

我们有一些混乱的 makefile 系统,我们将对其进行修复。但与此同时,我需要添加一个解决方法,如果你可以要求编译器(或链接器)链接一个库,我会徘徊,但前提是它存在。我知道如何修复 makefile,但这需要一些时间,同时我想要快速破解...

所以我有点像:

gcc <...other options...> -L ./some/path -l somelibrary

libsomelibrary.so 不存在时,会出现错误。在这种情况下,我希望它在不链接的情况下继续。那可能吗? - 一些链接器选项?

【问题讨论】:

  • 确定哪些库可用以及是否链接它们不是构建系统的工作吗?不确定它在 Makefiles 中是如何完成的,但在 CMake 中相当简单,所以我相信它也可以在那里完成。
  • 通常,当库链接到应用程序时,这样做是有原因的。如果代码未使用它(因此不链接库将使代码编译) - 它可以完全删除。如果它被代码使用,并且你删除了这样的链接器指令:你会得到未解决的外部符号错误,使其由于其他原因无法编译。
  • @DanM。是的,你是对的。但正如我所说 - 我可以修复 makefile,但它需要在许多领域进行大量工作......我只是在问这个问题(作为快速破解)是否可以通过 gcc 完成 :)
  • @code_fodder 你无论如何都要改变 gcc 调用。因此,您可以将somelibrary 替换为$SOMELIB var,并且仅在检查此类库是否存在成功时才设置它。
  • @DanM。啊,对不起 - 我明白你的意思,是的,这可以工作:)

标签: c++ gcc g++ shared-libraries


【解决方案1】:

你可以替换

gcc <...other options...> -L ./some/path -l somelibrary

在 Makefile 中

gcc <...other options...> -L ./some/path -l somelibrary || gcc <...other options...> -Wl,--unresolved-symbols=ignore-in-object-files

附带说明,您可以简单地使用./some/path/libsomelibrary.so,而不是-L ./some/path -l somelibrary

【讨论】:

    【解决方案2】:

    make 程序对被调用程序(在本例中为 gcc)的返回值作出反应。如果返回0,则表示成功。所有其他值都被视为错误。因此,您可以调用一个 bash 脚本作为中间解决方案进行链接。无论如何,只要让 bash 脚本返回 0 即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 2011-02-20
      相关资源
      最近更新 更多