最近升级了toolchain, 碰到一些问题,做一下总结,陆续会有问题加进来。
要注意一点的是,很多时候既不是toolchain的问题,也不是程序的问题,而是兼容性的问题。这时可以先去看看能否有新版本的程序来兼容新toolchain。要是仍然存在问题再慢慢查原因。
strace编译失败:
net.c:803: error: 'PACKET_ADD_MEMBERSHIP' undeclared here (not in a
function)
...
检查发现if_packet没有被include进来,原因呢,是在configure的时候检查if_packet.h是否存在时失败了,但是if_packet当然存在了。
再检查configure的做法,configure是写了一个简单的文件来编译,如果失败了就认为if_packet.h找不到(也就是不在include路径里)。我把这个临时文件存下来自己编译,发现居然是如下错误:
.../usr/include/linux/uio.h:47: error: expected declaration specifiers or '...' before 'size_t'
size_t居然不认识。再检查linux/types.h,确实原来的size_t定义被去掉了。那在哪定义了呢?原来在stddef.h中呢。
在新版本的strace(4.5.18)已经解决了这个兼容性问题,configure.ac中在检查if_packet.h时加入了stddef.h,这样configure就可以工作了。
AC_CHECK_HEADERS([linux/icmp.h linux/in6.h linux/netlink.h linux/if_packet.h],
[], [], [#include
#include ])
zlib编译失败
TLS definition in /lib/libc.so.6 section .tbss
mismatches non-TLS reference in libz.a
configure的时候报告:
Checking for errno.h... No.
Checking for mmap support... No.
在网上查了一下,有人碰到过。类似的问题是因为errno定义出现错误。很多人习惯写:
extern int errno;
但在多线程环境中,errno的定义并不是int类型的。从而出现了问题。解决的办法就直接包含 ,而不是自己声明一个外部变量。
#include
还有人在编译选项中使用 -include /usr/include/errno.h 来解决问题,没试过。但原理应该一样。
http://hi.baidu.com/dreamsujia/blog/item/a59cfb2bc28f6efde7cd4077.html
那么在zlib中是如何产生这样的问题的呢?zlib的代码也没有问题,只有在errno.h找不到的时候才会使用extern in errno。所以问题是configure没找到errno.h。那为什么找不到呢?
在configure中是这样测试errno.h是否存在的:
cat >$test.c <
#include
int main() { return 0; }
EOF
if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
echo "Checking for errno.h... Yes."
else
echo "Checking for errno.h... No."
CFLAGS="$CFLAGS -DNO_ERRNO_H"
fi
在上面的脚本中,`($CC -c $CFLAGS $test.c) 2>&1`不知道什么原因并没有实际执行编译(可能是我的编译环境的问题),所以不是空字符串。改成如下方式即可:
test_cmd=`$CC -c $CFLAGS $test.c 2>&1`
if test "`$test_cmd`" = ""; then
...
阅读(2738) | 评论(0) | 转发(0) |