【问题标题】:find_package(Backtrace) behaves strangelyfind_package(Backtrace) 行为异常
【发布时间】:2020-07-16 20:57:26
【问题描述】:

我正在查看 FindBacktrace 模块的文档,与 FindThreads 不同 - 我没有看到我可以依赖的适当库目标,例如Backtrace::Backtrace。它真的丢失了还是只是没有记录?

另外,当我使用这个模块时,我得到:

//Library providing backtrace(3), empty for default set of libraries
Backtrace_LIBRARY:FILEPATH=

在我的CMakeCache.txt 中(在 Devuan GNU/Linux 机器上)。这很奇怪。我期待看到-lbacktrace - 因为那是我得到backtrace_create_statebacktrace_pcinfo 的地方(我需要使用Boost stacktrace)。

那么,什么是“默认库集”? libbacktrace 默认情况下肯定不会链接到。

【问题讨论】:

    标签: cmake backtrace cmake-modules


    【解决方案1】:

    如果 CMake 提供的 Find Modules(例如 FindBacktrace)之一提供了导入的目标,则几乎肯定会记录在案。您可以检查查找模块的source code 以确定。在您的情况下,对于FindBacktrace.cmake,只需在文件中搜索它可能提供的导入目标的:: 语法。在撰写本文时,FindBacktrace.cmake 没有提供。

    因为许多 Find Modules 早于现代 CMake 的到来,实际上有 许多 它们还没有提供导入的目标。我想 CMake 维护人员正在根据每个模块的需求和受欢迎程度来处理此任务,因此为 FindBacktrace 模块编写 CMake 问题可能会引发一些行动。

    如果受到启发,您还可以编写自己的修改 FindBacktrace.cmake 文件,添加必要的 CMake 代码来定义导入的目标 Backtrace::Backtrace


    如果系统(例如libc)提供对backtrace(3) 的支持,则预计Backtrace_LIBRARY 变量将为空。 FindBacktrace 模块将选择可用的默认库,并将其填充到 Backtrace_LIBRARIES

    Backtrace_LIBRARY 缓存路径只有在您的系统上可以通过其他一些外部库或包(例如在非 glibc 系统上)获得回溯时才应使用。在这种情况下,您将手动填充 Backtrace_LIBRARY

    【讨论】:

    • 嗯,问题是,似乎某些功能不在系统库中:backtrace_create_statebacktrace_pcinfo。我正在尝试使用具有回溯功能的 Boost stacktrace 库,它需要这些功能。要拥有它们,我需要添加-lbacktrace
    • @einpoklum 如果该功能不是通过系统库提供的,您可能必须在别处获取不同的回溯实现,安装它,然后填充 Backtrace_LIBRARY 缓存条目(可能还有 @ 987654339@) 将 CMake 指向这个新安装。
    • 它似乎是libgcc的一部分,所以它是一种系统库;但您仍然需要明确链接它。我猜有点像 libdl,它是 libc 的一部分。
    【解决方案2】:

    正如@squareskittles 所建议的,这只是 CMake 开发人员应该注意的事情。

    我已就此事提交了bug against CMake 并将(希望记得)更新此问题以表明模块何时更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 2017-01-22
      • 2013-04-14
      • 2014-01-29
      • 1970-01-01
      相关资源
      最近更新 更多