Chinaunix首页 | 论坛 | 博客
  • 博客访问: 503586
  • 博文数量: 35
  • 博客积分: 3472
  • 博客等级: 中校
  • 技术积分: 935
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-04 06:54
文章分类
文章存档

2014年(4)

2013年(2)

2011年(3)

2010年(9)

2009年(9)

2008年(8)

分类: C/C++

2009-09-23 15:12:27



最近升级了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
...


阅读(2671) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~