Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GCC 4.8.1(MingGW)-D选项不能正常工作_Gcc_Mingw_Mingw32 - Fatal编程技术网

GCC 4.8.1(MingGW)-D选项不能正常工作

GCC 4.8.1(MingGW)-D选项不能正常工作,gcc,mingw,mingw32,Gcc,Mingw,Mingw32,我最近将我的GCC(MinGW)升级到了4.8.1版,并且遇到了-D选项的问题。例如,下面的main.c代码 #include <stdio.h> int main(void) { printf("Hello world!\n"); #ifdef TEST printf("We are in testing mode!\n"); #endif // TEST return 0; } 但以下两项工作: gcc -DTEST=

我最近将我的GCC(MinGW)升级到了4.8.1版,并且遇到了-D选项的问题。例如,下面的main.c代码

  #include <stdio.h>
  int main(void) {
    printf("Hello world!\n");
    #ifdef TEST
      printf("We are in testing mode!\n");
    #endif // TEST 
    return 0;
  }
但以下两项工作:

gcc -DTEST= main.c -o main.exe
gcc -DTEST=1 main.c -o main.exe
我以前版本的GCC(我相信4.6)没有这个问题。这是虫子吗

下面是为
gcc-v-DTEST-E-dM-cmain.c
编辑的输出转储。请注意
#定义测试1

...
#define STDOUT_FILENO 1
#define test 1
#define _PID_T_ 
#define __LDBL_MIN_EXP__ (-16381)
...
Using built-in specs.
COLLECT_GCC=c:\MinGW\bin\gcc.exe
Target: mingw32
Configured with: ../gcc-4.8.1/configure --prefix=/mingw --host=mingw32 --build=m
ingw32 --without-pic --enable-shared --enable-static --with-gnu-ld --enable-lto
--enable-libssp --disable-multilib --enable-languages=c,c++,fortran,objc,obj-c++
,ada --disable-sjlj-exceptions --with-dwarf2 --disable-win32-registry --enable-l
ibstdcxx-debug --enable-version-specific-runtime-libs --with-gmp=/usr/src/pkg/gm
p-5.1.2-1-mingw32-src/bld --with-mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld --
with-mpfr= --with-system-zlib --with-gnu-as --enable-decimal-float=yes --enable-
libgomp --enable-threads --with-libiconv-prefix=/mingw32 --with-libintl-prefix=/
mingw --disable-bootstrap LDFLAGS=-s CFLAGS=-D_USE_32BIT_TIME_T
Thread model: win32
gcc version 4.8.1 (GCC)
COLLECT_GCC_OPTIONS='-v' '-D' 'TEST' '-E' '-dM' '-c' '-mtune=generic' '-march=pe
ntiumpro'
c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/cc1.exe -E -quiet -v -iprefix c:\ming
w\bin\../lib/gcc/mingw32/4.8.1/ -D TEST main.c -mtune=generic -march=pentiumpro
-dM
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/inclu
de"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/../..
/../../include"
ignoring nonexistent directory "/mingw/include"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/inclu
de-fixed"
ignoring duplicate directory "c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/../..
/../../mingw32/include"
ignoring nonexistent directory "/mingw/include"
#include "..." search starts here:
#include <...> search starts here:
c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include
c:\mingw\bin\../lib/gcc/mingw32/4.8.1/../../../../include
c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include-fixed
c:\mingw\bin\../lib/gcc/mingw32/4.8.1/../../../../mingw32/include
End of search list.
COMPILER_PATH=c:/mingw/bin/../libexec/gcc/mingw32/4.8.1/;c:/mingw/bin/../libexec
/gcc/;c:/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/bin/
LIBRARY_PATH=c:/mingw/bin/../lib/gcc/mingw32/4.8.1/;c:/mingw/bin/../lib/gcc/;c:/
mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/lib/;c:/mingw/bin/../lib/
gcc/mingw32/4.8.1/../../../
COLLECT_GCC_OPTIONS='-v' '-D' 'TEST' '-E' '-dM' '-c' '-mtune=generic' '-march=pe
ntiumpro'
。。。
#定义标准输出文件编号1
#定义测试1
#定义
#定义\uuuuLDBL\uMin\uExp\uuuu1(-16381)
...
使用内置规格。
COLLECT\u GCC=c:\MinGW\bin\GCC.exe
目标:mingw32
配置为:../gcc-4.8.1/configure--prefix=/mingw--host=mingw32--build=m
ingw32——不带pic——启用共享——启用静态——带gnu ld——启用lto
--启用LIPSSP——禁用多个LIB——启用语言= C、C++、FORTRAN、Objc、Obj-C++
,ada--禁用sjlj异常--使用-dwarf2--禁用-win32-registry--启用-l
IBMTDCxx调试--启用特定于版本的运行时libs--使用gmp=/usr/src/pkg/gm
p-5.1.2-1-mingw32-src/bld——带mpc=/usr/src/pkg/mpc-1.0.1-1-mingw32-src/bld--
mpfr=--系统zlib--gnu为--enable decimal float=yes--enable-
libgomp--启用线程--具有libiconv前缀=/mingw32--具有libintl前缀=/
mingw——禁用引导LDFLAGS=-s CFLAGS=-D\u使用\u 32位\u时间
线程模型:win32
gcc版本4.8.1(gcc)
COLLECT\u GCC\u OPTIONS='-v'-D'-TEST'-E'-dM'-c'-mtune=generic'-march=pe
恩蒂姆普罗
c:/mingw/bin/./libexec/gcc/mingw32/4.8.1/cc1.exe-E-quiet-v-iprefix c:\ming
w\bin\../lib/gcc/mingw32/4.8.1/-D TEST main.c-mtune=generic-march=pentiumpro
-dM
忽略重复目录“c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/include”
“德”
忽略重复目录“c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/../。。
/../../include“
忽略不存在的目录“/mingw/include”
忽略重复目录“c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/include”
“取消固定”
忽略重复目录“c:/mingw/lib/gcc/../../lib/gcc/mingw32/4.8.1/../。。
/../../mingw32/include“
忽略不存在的目录“/mingw/include”
#包括“…”搜索从这里开始:
#包括搜索从这里开始:
c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include
c:\mingw\bin\../lib/gcc/mingw32/4.8.1/../../../../../include
c:\mingw\bin\../lib/gcc/mingw32/4.8.1/include-fixed
c:\mingw\bin\../lib/gcc/mingw32/4.8.1/../../../../../../mingw32/include
搜索列表结束。
编译器_PATH=c:/mingw/bin/./libexec/gcc/mingw32/4.8.1/;c:/mingw/bin/。/libexec
/gcc/;c:/mingw/bin/./lib/gcc/mingw32/4.8.1/../../../../../../mingw32/bin/
LIBRARY_PATH=c:/mingw/bin/。/lib/gcc/mingw32/4.8.1/;c:/mingw/bin/。/lib/gcc/;c:/
mingw/bin/./lib/gcc/mingw32/4.8.1/../../../../../../mingw32/lib/;c:/mingw/bin//lib/
gcc/mingw32/4.8.1/../..//
COLLECT\u GCC\u OPTIONS='-v'-D'-TEST'-E'-dM'-c'-mtune=generic'-march=pe
恩蒂姆普罗

我确认最新MinGW上的错误:

对于MinGW(当前存储库版本)中提供的GCC4.8.1,使用-DDEBUG定义了一个小写调试符号

下面是一个简化的测试用例:

文件“toto.cpp”:

int debug = 1;
命令行:

$ g++ -c -DDEBUG toto.cpp
<command-line>:0:7: error: expected unqualified-id before numeric constant
toto.cpp:1:5: note: in expansion of macro 'debug'
 int debug = 1;
     ^
$g++-c-DDEBUG toto.cpp
:0:7:错误:数字常量前应为非限定id
toto.cpp:1:5:注意:在宏“debug”的扩展中
int-debug=1;
^
预处理文件中有一个小写的“DEBUG”,显然是假的:

$ g++ -E -dMID -pipe -DDEBUG toto.cpp
[snip]
#define __WINNT__ 1
# 1 "toto.cpp"
#define WINNT 1
# 1 "toto.cpp"
#define _INTEGRAL_MAX_BITS 64
# 1 "toto.cpp"
#define __declspec(x) __attribute__((x))
# 1 "toto.cpp"
#define __DECIMAL_BID_FORMAT__ 1
# 1 "<command-line>"
#define debug 1
# 1 "toto.cpp"
int 1 = 1;
$g++-E-dMID-pipe-DDEBUG toto.cpp
[剪报]
#定义温特1
#1“toto.cpp”
#定义WINNT 1
#1“toto.cpp”
#定义_积分_最大_位64
#1“toto.cpp”
#定义declspec(x)\属性(x))
#1“toto.cpp”
#定义十进制投标格式1
# 1 ""
#定义调试1
#1“toto.cpp”
int 1=1;

因此,是的,这一版本的GCC存在主要问题…

我看不出您在我的MinGW安装GCC 4.8.1时所描述的问题。请将
gcc-v-DTEST-E-dM-cmain.c的输出发布到您的问题中。我发现了问题;谢谢你的建议。显然,我的GCC确实注入了
#define
,但它是由小写字母组成的。这就是我的汇编不起作用的原因。如果我使用了
-DTEST=
,那么它是大写的。我仍然认为我的GCC版本有缺陷。输出相当长。我如何发布它?注意:我通过MinGW安装了GCC。这很奇怪。GCC清楚地看到了所有caps
测试(它在
COLLECT\u GCC\u OPTIONS
输出中显示)-我不知道是什么导致它在预处理器中将其小写。我从你那里得到了我的MinGW,你可能想问问提供你使用的MinGW的人,他们是否知道发生了什么。我现在倾向于在你的构建中出现一个bug,而不是在你的环境中出现一些bug,这是我之前猜测的。我想知道这是否发生在另一个名字上?试试看:
gcc-DFOOBAR-E-dM-cmain.c | grep-ifoobar
foobar
是否变成小写?
$ g++ -E -dMID -pipe -DDEBUG toto.cpp
[snip]
#define __WINNT__ 1
# 1 "toto.cpp"
#define WINNT 1
# 1 "toto.cpp"
#define _INTEGRAL_MAX_BITS 64
# 1 "toto.cpp"
#define __declspec(x) __attribute__((x))
# 1 "toto.cpp"
#define __DECIMAL_BID_FORMAT__ 1
# 1 "<command-line>"
#define debug 1
# 1 "toto.cpp"
int 1 = 1;