【发布时间】:2013-02-19 18:36:09
【问题描述】:
我正在使用不同版本的 gcc 的 2 台不同的机器上编译我的源代码。
cflags c89
-Wall -Wextra -Wunreachable-code -g -m32 -D_DEBUG -O0 -D_LARGEFILE64_SOURCE -D_REETRANT -D_THREAD_SAFE
一个是redhat-4
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-46)
Linux 203_test_server 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:48 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux
还有一个是 Fedora 18
gcc (GCC) 4.7.2 20121109 (Red Hat 4.7.2-8)
Linux localhost.localdomain 3.8.1-201.fc18.x86_64 #1 SMP Thu Feb 28 19:23:08 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
我的 fedora 18 编译没有错误。但是,在 redhat 4 机器上我得到了一些错误。
channel.h:35: error: redefinition of typedef ‘channel_t’
internal.h:19: error: previous declaration of ‘channel_t’ was here
我认为错误只是一个循环问题。但是,如果使用相同的代码库,在 2 台不同的机器上编译,使用 2 种不同版本的 gcc 真的会有所不同吗?
我在想使用较新版本的编译器会产生更多错误,因为较新的编译器可能更严格。
这不是解决错误的问题,而是关于编译器的一般问题。
我可以设置任何标志来避免将来发生这种情况。也许如果在这个版本的 gcc 上编译,如果版本不兼容?
【问题讨论】:
-
是的,不同的编译器/版本/标志可能会产生不同的结果,尤其是。在
#ifdef-heavy 代码中。 -
至于
any flags I can set to avoid this in the future,我的回答是否涵盖了这一点,还是您在想一些不同的东西? -
一些有用的信息会很好,它更有可能是一个系统上的包含头文件,而不是编译器,但你永远不会提到 channel.h 或 internal.h 的位置或它们是如何被包含的。 channel_t 出现的周围的线条也很有用……至少对 ifdefs 来说是这样。没有它,您的 CFLAG 定义就毫无意义。