4

我正在尝试构建一个使用 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
4

2 回答 2

1

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

于 2019-01-07T13:43:31.590 回答
0

正如塔尼所说,

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

于 2020-03-26T08:34:45.147 回答