【问题标题】:linker unable to find __assert_fail链接器找不到 __assert_fail
【发布时间】:2013-08-12 11:56:36
【问题描述】:

我正在尝试构建一个使用 boost 的库,当该库编译正常时,它遇到了一个我不明白的奇怪的链接器错误。我构建并安装了 Boost 1.54(也尝试了 1.52),效果很好。

它声称无法找到 __assert_fail,我认为它是标准库的一部分。我试图用 64 位构建所有东西。我在 Fedora 16 上,使用 gcc 4.6.3

有什么想法吗?

做全是 make[1]: 进入目录`/data/adrian/code/ext/mapper/cmappertools' /bin/sh ./libtool --tag=CXX --mode=link g++ -g -O2 -o libcmappertools.la -rpath /usr/local/lib/python2.7/site-packages cmappertools.lo libtool:链接:g++ -fPIC -DPIC -shared -nostdlib /usr/lib/gcc/x86_64-redhat-linux/4.6.3/../../../../lib64/crti.o /usr/ lib/gcc/x86_64-redhat-linux/4.6.3/crtbeginS.o .libs/cmappertools.o -L/usr/lib/gcc/x86_64-redhat-linux/4.6.3 -L/usr/lib/gcc/ x86_64-redhat-linux/4.6.3/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/ gcc/x86_64-redhat-linux/4.6.3/../../.. -lstdc++ -lm -lc -lgcc_s /usr/lib/gcc/x86_64-redhat-linux/4.6.3/crtendS.o /usr /lib/gcc/x86_64-redhat-linux/4.6.3/../../../../lib64/crtn.o -O2 -Wl,-soname -Wl,libcmappertools.so.0 -o 。库/libcmappertools.so.0.0.0 .libs/cmappertools.o:在函数“condition_variable”中: /usr/local/include/boost/thread/pthread/condition_variable_fwd.hpp:69: 未定义对“__assert_fail”的引用 /usr/local/include/boost/thread/pthread/condition_variable_fwd.hpp:69: 未定义对“__assert_fail”的引用 .libs/cmappertools.o:在函数“~mutex”中: /usr/local/include/boost/thread/pthread/mutex.hpp:108: 未定义对“__assert_fail”的引用 .libs/cmappertools.o:在函数“condition_variable”中: /usr/local/include/boost/thread/pthread/condition_variable_fwd.hpp:69: 未定义对“__assert_fail”的引用 .libs/cmappertools.o:在函数“~mutex”中: /usr/local/include/boost/thread/pthread/mutex.hpp:108: 未定义对“__assert_fail”的引用 .libs/cmappertools.o:/usr/local/include/boost/smart_ptr/shared_array.hpp:194: 更多未定义的对 `__assert_fail' 的引用如下 /usr/local/bin/ld: .libs/libcmappertools.so.0.0.0: 隐藏符号“__assert_fail”未定义 /usr/local/bin/ld:最终链接失败:错误值 collect2: ld 返回 1 个退出状态 make[1]: *** [libcmappertools.la] 错误 1 make[1]: 离开目录`/data/adrian/code/ext/mapper/cmappertools' make: *** [全部] 错误 2

【问题讨论】:

  • __assert_fail 通常是libc 的一部分。您的/lib/libc.so.6 和/或/lib64/libc.so.6 中有吗?
  • 是的——两者都有。而且g++的调用确实有-lc,所以应该可以找到[adrian@tiger cmappertools]$ nm /lib/libc.so.6 | grep __assert_fail 4c7f2700 T __assert_fail 4c7f2550 t __assert_fail_base 4c7f2700 t __GI___assert_fail [adrian@tiger cmappertools]$ nm /lib64/libc.so.6 | grep __assert_fail 0000003e1002ef00 T __assert_fail 0000003e1002ed80 t __assert_fail_base 0000003e1002ef00 t __GI___assert_fail
  • 那么您的 libtool 可能使用了错误的链接行。尝试手动链接,或将-v 添加到链接器标志以查看问题所在。
  • 如果我错了,请纠正我,但我没有在上面的第四行看到-nostdlib(就在第一条错误消息的上方)?
  • 是的,但是 -lc 和 -lgcc_s 是明确指定的。我确实尝试摆脱 -nostdlib 标志,但没有任何区别..

标签: c++ linker


【解决方案1】:

几年后,在不同的 Fedora (29)、更高版本的 boost、gcc 等上。我遇到了同样的问题。 更多的是直觉而不是理解我摆脱了 gcc 可见性编译指示 (即我注释掉了所有的: #pragma GCC 可见性推送({whatever}) ... #pragma GCC 可见性弹出) 这样就成功了——它编译、链接并成功运行。

【讨论】:

    【解决方案2】:

    正如塔尼所说,

    hidden symbol `__assert_fail' isn't defined
    

    确实是#pragma GCC visibility push(hidden)引起的

    但是,如果您绝对需要隐藏某些调用 assert 宏的函数,则应在隐藏任何符号之前包含,例如

    
    // Wrong place to hide
    // #pragma GCC visibility push(hidden) 
    
    #include <assert.h>
    
    // Right place to hide
    #pragma GCC visibility push(hidden) 
    
    void fatal_debug(int foo, int bar){
        assert(foo == bar);
    }
    
    
    #pragma GCC visibility pop
    
    

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多