关于C未初始化全局变量的连接问题

来源:互联网 发布:wifi连不上网络 有信号 编辑:程序博客网 时间:2024/05/21 15:50

昨天今天遇到了一个很奇怪的问题~~~

缘由是在看去年华为软件挑战赛冠军的源代码时,初赛使用的是C语言开发,发现用了很多的全局变量,而且让人很奇怪的是全局变量的定义放在了一个头文件中,但是都没有初始化,这个头文件是一个万能头文件,当时觉得在连接的时候应该会出问题,但是根据提供的makefile进行编译连接时居然没毛病,让我大惑不解~~~

遇到这种问题当然就是拿出nm来看一些obj文件咯,所以查看一下生成的.o文件,发现在万能h文件中定义的全局变量的符号类型为C,用man查看了一下,发现是什么common symbol。也没多想,毕竟主要在算法的研究,所以想要调试一下这个代码,不想用gdb,用不习惯,在mac平台,就用xcode吧,打开xcode,把左右源文件拉进去,添加到编译单元,设置好头文件路径,设置好预处理宏,然后编译运行试一下呗,结果悲剧了,在解决了几个编译小问题之后,发现没法链接成功,原因是有几千个duplicate symbol。

果然还是出问题了。那么问题就来了,为什么使用makefile进行编译连接的时候完全没毛病,用xcode就jj了呢?

本着刨根问底的精神,就在网上搜索了一下,几乎千篇一律都是关于不要在头文件中放定义的。没办法了,还是只有从.o文件入手,毕竟连接问题都和.o有关,继续用nm查看obj文件,猜想可能和这个是否初始化有关,所以来一个demo呗。写了一个小demo,模拟同样的环境,结果果然,在头文件中如果定位的全局变量不是位初始化全局变量,那么使用clang命令编译是不行的,但是没用啊,同样的代码在xcode中还是编译不过啊。同时发现现在clang在进行编译的时候,有的函数原型甚至可以不用声明也可以在模块(.c)间用了,真是越来越高级了。那就使用sublime来试一下吧,打开同样的代码,发现sublime并不能编译成功,输出的信息中看到了c++的字符,猜想可能是使用了c++编译器来编译C文件,所以又在xcode中更改了相关的设置,但是还是不行,编译不过。看来这个代码使用xcode是没办法了。但是至少找到了原因了。看来有时候必须得要用gdb。vs没有试过,有时间试一下。

顺便说一下,作者之所以这样设计,猜想可能是为了性能考虑,毕竟是比赛,如果用malloc这些效率就不行。同时传递参数很方便。

0 0
原创粉丝点击