gcc不是因为它负责汇编文件中的预处理器吗?

时间:2016-07-07 07:47:31

标签: gcc assembly c-preprocessor eclipse-cdt

我发现CDT使用相应的后端工具(例如x86_64-w64-mingw32-as)默认情况下在C/C++ Build > Settings > Tool Settings > GCC Assembler上配置的eclipse上编译程序集文件。

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

# Each subdirectory must supply rules for building sources it contributes
src/%.o: ../src/%.c
    @echo 'Building file: $<'
    @echo 'Invoking: Cygwin C Compiler'
    x86_64-w64-mingw32-gcc -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<"
    @echo 'Finished building: $<'
    @echo ' '

src/%.o: ../src/%.cpp
    @echo 'Building file: $<'
    @echo 'Invoking: Cygwin C++ Compiler'
    x86_64-w64-mingw32-g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@)" -o "$@" "$<"
    @echo 'Finished building: $<'
    @echo ' '

src/%.o: ../src/%.S
    @echo 'Building file: $<'
    @echo 'Invoking: GCC Assembler'
    x86_64-w64-mingw32-as  -o "$@" "$<"
    @echo 'Finished building: $<'
    @echo ' '

虽然Options Controlling the Kind of Output

  

file.s汇编代码。
  file.S file.sx必须预处理的汇编代码。

我认为这里preprocessed引用c预处理器。但是,它必须是gcc file.S而不是as file.S(大写'S'),后者会提示类似Error: junk at end of line, first unrecognized character is的错误('`当文件包含C预处理器时。请参阅以下示例(.S):

#ifdef __x86_64__

#if defined(SYMBOL_UNDERSCORE)
#define GLOBL_SYMBOL(x) _##x
#else
#define GLOBL_SYMBOL(x) x
/* #error "============" */
#endif

.globl GLOBL_SYMBOL(foo)

#endif

==

因此,gcc负责预处理器(gcc工作程序的一步),对吧? 根据这种想法,以下(.S)将起作用......

/* https://sourceforge.net/p/predef/wiki/Architectures */
/* #ifdef __LP64__ || _LP64 */
#if defined(__i386__) || defined(_M_IX86)
# include "nomakefile/foo_x86.S"
#elif defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64)
# include "nomakefile/foo_x64.S"
#else
# error Unsupported architecture
#endif

ASLO

1 个答案:

答案 0 :(得分:4)

是。 gcc二进制文件决定要调用的程序。如果它看到带有后缀s的文件,则会调用as。如果它看到带有后缀S的文件,则会调用cpp,然后as。汇编程序as本身并不了解后缀约定,也不会为您调用C预处理程序。