【问题标题】:undefined symbol: _ZL22__gthrw_pthread_cancelm error未定义符号:_ZL22__gthrw_pthread_cancelm 错误
【发布时间】:2013-06-21 09:03:20
【问题描述】:

我有一个需要编译为 32 位应用程序的 C++/C 应用程序(因为某些第三方库仅可用于 32 位)。但是,编译和执行都将在 CentOS 6.4 x86_64 机器上进行。

我正在使用 gnu 自动工具进行构建。在做了很多谷歌搜索之后,终于想出了一组选项给./configure 以创建 32 位可执行文件/共享对象。设置LD_LIBRARY_PATH 搜索/lib, /usr/lib/, /usr/lib/gcc/... 而不是/lib64, ... 使用file 命令验证所有生成的.so 和可执行文件都是32 位的。

但如果我运行可执行文件,我会收到错误消息:“undefined symbol: _ZL22__gthrw_pthread_cancelm”。

有什么线索吗?

【问题讨论】:

    标签: c++ c linux cross-compiling x86-64


    【解决方案1】:

    您似乎忘记使用 -lpthread 链接到 pthread。

    GCC 添加了一个layer of abstraction over pthreads,并且这个抽象使用了弱符号,因此您可以构建您的可执行文件而不会出现链接错误但在运行时会失败。

    【讨论】:

    • 也这样做了 - 仍然没有运气!
    【解决方案2】:

    您的目标主机上是否有 32 位 pthread 库?如果没有,我想你需要安装一个。还要检查目标主机上ldd <my-program> 的输出,这可能会帮助您找出缺少的内容。

    【讨论】:

    • 是的,有。通过file 传递ldd 返回的所有库路径并验证都是32 位的。
    • 如果你#include 尝试在它周围加上extern "C",你永远不会知道!
    • 谷歌也提出了这个bugzilla.redhat.com/show_bug.cgi?id=178354。你的代码中是否碰巧有类似#define __attribute__() 的东西?
    • 限制是我的代码没有使用 ptherad - 似乎第三方库正在使用它 - 标头确实包含 pthreadh
    • 如果是这样,至少没有您提到的第三方库文档的链接,我无法帮助您。您的第三方库可能带有单线程版本和不包含 pthread 的方法(很可能在预处理阶段使用 -DNO_THREADS 之类的东西),您可能需要查看他们的文档以了解类似的内容。
    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 2013-10-22
    • 2014-06-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多