昨天今天遇到了一个很奇怪的问题~~~
缘由是在看去年华为软件挑战赛冠军的源代码时,初赛使用的是C语言开发,发现用了很多的全局变量,而且让人很奇怪的是全局变量的定义放在了一个头文件中,但是都没有初始化,这个头文件是一个万能头文件,当时觉得在连接的时候应该会出问题,但是根据提供的makefile进行编译连接时居然没毛病,让我大惑不解~~~
遇到这种问题当然就是拿出nm来看一些obj文件咯,所以查看一下生成的.o文件,发现在万能h文件中定义的全局变量的符号类型为C,用man查看了一下,发现是什么common symbol。也没多想,毕竟主要在算法的研究,所以想要调试一下这个代码,不想用gdb,用不习惯,在mac平台,就用xcode吧,打开xcode,把左右源文件拉进去,添加到编译单元,设置好头文件路径,设置好预处理宏,然后编译运行试一下呗,结果悲剧了,在解决了几个编译小问题之后,发现没法链接成功,原因是有几千个duplicate symbol。
果然还是出问题了。那么问题就来了,为什么使用makefile进行编译连接的时候完全没毛病,用xcode就jj了呢?
本着刨根问底的精神,就在网上搜索了一下,几乎千篇一律都是关于不要在头文件中放定义的。没办法了,还是只有从.o文件入手,毕竟连接问题都和.o有关,继续用nm查看ob