【发布时间】: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 标志,但没有任何区别..