【问题标题】:Troubleshooting compile time link errors编译时链接错误疑难解答
【发布时间】:2010-01-08 17:56:03
【问题描述】:

在使用新工具链从源代码构建 libcrypto.a(来自 openssl 库)后,我正在尝试静态链接。但是,每当我尝试使用该库中的任何函数时,我都会不断收到“未定义的引用”错误。我已确保包含正确的头文件。我还仔细检查了 libcrypto.a 的符号表,并确保确实定义了这些函数。

我还能做些什么来调试这个错误——比如从链接器中获取更多信息或检查 libcrypto.a 本身,以找出当指示符号出现时链接器为何吐出“未定义引用”错误的原因在符号表中?

【问题讨论】:

  • 发布一些错误信息。
  • 没关系,通过重新调整链接器参数的顺序来解决这个问题。我在 -o 之前有静态库。切换它们并且它起作用了......不知道为什么,但显然链接器参数的顺序有所不同

标签: c++ gcc linker openssl


【解决方案1】:

未定义的引用/符号是链接器错误,表示链接器在任何被链接的目标模块中都找不到指定的符号。这表示以下一项或多项:

  1. 指定的类/方法/函数/变量/在项目的任何地方都没有定义。
  2. 符号不可访问,可能是由于访问说明符(在 C++ 中,不适用于 ANSI C)
  3. 引用不正确。这可能是由于拼写错误或类似问题造成的。 (不太可能)
  4. 在调用链接器时,您忽略了在构建脚本中包含所需的库。

【讨论】:

    【解决方案2】:

    我看到你的帖子被标记为c++。 OpenSSL 是用 C 语言编写的。

    你还记得吗

    extern "C" {
    #include <various SSL files>
    }
    

    ?

    【讨论】:

    • 不——它已经有了这些——例如 md5.h 在顶部有一个 '#ifdef __cplusplus extern "C" { #endif' (超过三行)。
    【解决方案3】:

    使用 nm 从 libcrypto 中 grep 符号

    所以你可以看看它是否在那里 - 可能不是(duh)

    ssl 有 2 个库,可能你用错了

    缺少的符号是什么

    【讨论】:

    • 实际上,调用 libcrypto 中的任何函数都会返回“未定义的引用”。我专注于一个随机的
    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多