【问题标题】:How to detect unresolved symbol when creating a library?创建库时如何检测未解析的符号?
【发布时间】:2011-02-08 19:25:42
【问题描述】:

在 Solaris 10 下,我正在创建一个库 A.so,它调用在库 B.so 中定义的函数 f()。为了编译库 A.so,我在代码中将 f() 声明为 extern。

不幸的是,我“忘记”在 A 的 makefile 中声明它必须与 B 链接。 但是,“make A”不会导致任何警告、错误,并且会创建库 A.so。

当然,在执行A的代码时,f()的调用会因为未定义而崩溃。

有没有办法(链接器选项,代码技巧......)使库 A 的编译失败? 如何确定库 A 中引用的所有符号都是在编译时定义的?

感谢您的任何建议。

【问题讨论】:

    标签: c++ linker symbols


    【解决方案1】:

    最简单的方法:在 makefile 中添加一个“test_lib”目标,这将使用从 libraryA 导出的所有符号生成一个二进制文件。 (不必有任何意义......只需获取地址,无需调用函数或任何东西,只需要引用它)。

    【讨论】:

      【解决方案2】:

      坦克

      我想我在链接器手册 (d'ho) 中发现了一些有趣甚至更简单的内容

      -z defs 选项和 --no-undefined 选项会在链接末尾保留任何未定义符号时强制执行致命错误。此模式是构建可执行文件时的默认模式。由于历史原因,此模式不是构建共享对象时的默认模式。建议使用 -z defs 选项,因为此模式可确保正在构建的对象是独立的。自包含对象的所有符号引用都在内部解析,或者解析到对象的直接依赖项。

      【讨论】:

      猜你喜欢
      • 2012-12-13
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 2012-07-29
      相关资源
      最近更新 更多