在windows中为gcc定义符号

在windows中为gcc定义符号,c,gcc,linker,timestamp,symbols,C,Gcc,Linker,Timestamp,Symbols,我尝试在windows上使用链接器符号作为带有gcc的时间戳: gcc.exe -DTIMESTAMP=$(shell "C:/mingw/msys/1.0/bin/date.exe +%s") -E helloworld.c -o test.E 但我得到的结果是: gcc.exe:错误:C:/mingw/msys/1.0/bin/date.exe+s):没有此类文件或 目录 命令行上的“C:/mingw/msys/1.0/bin/date.exe+s”可以工作 我做错了什么?这里有多个问题:

我尝试在windows上使用链接器符号作为带有gcc的时间戳:

gcc.exe -DTIMESTAMP=$(shell "C:/mingw/msys/1.0/bin/date.exe +%s") -E helloworld.c -o test.E
但我得到的结果是:

gcc.exe:错误:C:/mingw/msys/1.0/bin/date.exe+s):没有此类文件或 目录

命令行上的“C:/mingw/msys/1.0/bin/date.exe+s”可以工作


我做错了什么?

这里有多个问题:

  • $()
    不是有效的命令行语法,它是一个
    bash
    功能。您需要
    call
    命令或
    cmd/C
  • shell
    不是命令、批处理文件或二进制文件。如果你有一个与上面的子shell,它是不必要的
  • 百分号必须用另一个百分号转义
    %%
  • 以下是在命令行(而不是Powershell)中执行此操作的方法:

    REM将date.exe的输出存储到临时文件中
    C:/mingw/msys/1.0/bin/date.exe+%%s>tmpfile
    REM将文件读入变量
    SET/P格式的日期= < P>所有C99编译器(好,更像所有的C编译器)——绝对包括GCC和Visual C++,以及几乎任何你可能使用的通用C编译器都已经提供宏;你不使用它们有什么原因吗

    它们扩展为字符串文本,引用预处理器运行的日期和时间<代码>\uuuuuuuuuuuuuuuuuu日期
    扩展为
    “Mmm Dd YYYY”
    ,例如
    “2016年11月1日”
    <代码>时间扩展为
    “hh:mm:ss”
    ,例如
    “23:59:59”

    如果您想在对象文件中使用编译时间戳,可以使用

    const char timestamp[] = __DATE__ " " __TIME__ ;
    
    在你的C代码中


    当您在一个较大的项目中需要一个共享宏时,通过多次调用编译器(比如在一个Makefile中)生成一个包含在所有编译命令中的头文件。比如说,

    rm -f timestamp.h
    date '+#define TIMESTAMP "%Y-%m-%d %H:%M:%S"' > timestamp.h
    

    并将flag
    -imacros timestamp.h
    添加到GCC选项中。

    我尝试了“GCC.exe-dtimestap=$(shell C:/mingw/msys/1.0/bin/date.exe+%%s)-E helloworld.C-o test.E”,但没有更改任何内容。。。Givs me:gcc.exe:错误:+%s):没有这样的文件或目录您正在尝试从Windows控制台(“DOS提示符”/“命令提示符”)运行此命令吗?是。我写了一个bat文件来测试它。谢谢。我明白,但我无法让它发挥作用。什么是正确的选择?是的,我以前做过。但它只设置实际文件的时间。不适合整个项目。我需要一个解决方案,在每个构建中我的构建数量都会增加…@christoph.:那么,添加的方法如何?您甚至可以使用
    date'+#define BUILDNUMBER%s>BUILDNUMBER.h
    (和
    -imacros BUILDNUMBER.h
    )将其作为十进制数(从纪元开始算起的秒数)。@ChristophP.:要将其存储到字符串中,请使用例如
    #define STRINGIFY_x#x
    #define STRINGIFY x(STRINGIFY ux)
    ,和
    const char BUILDNUMBER[]=字符串化(BUILDNUMBER)
    rm -f timestamp.h
    date '+#define TIMESTAMP "%Y-%m-%d %H:%M:%S"' > timestamp.h