【问题标题】:Call and compile C code from a batch file?从批处理文件调用和编译 C 代码?
【发布时间】:2013-07-06 04:02:49
【问题描述】:

对于汇编器中的小段代码对我来说放置它们很舒服 在批处理文件中直接编译或在远程 Windows 机器中编译。

这是我设计用于 MASM32 的工作 .bat 文件

;@goto end
.486
.model flat,stdcall
option casemap:none

include     \masm32\include\kernel32.inc  
include     \masm32\include\user32.inc
includelib  \masm32\lib\user32.lib
includelib  \masm32\lib\kernel32.lib

.data
      msg   db   "Hello Word",0
.code   
start:
  push 0
  push offset msg
  push offset msg
  push 0
  call MessageBox
  push 0
  call ExitProcess
end start

:end
@echo off
set name=%~n0
set cmpname=ml.exe
set linkname=link.exe
for %%X in (%cmpname%) do (set CMPL=%%~$PATH:X)
if defined CMPL ( 
  for %%I in (%linkname%) do (set MLINK=%%~$PATH:I)
    if defined MLINK (    
    %CMPL% /nologo /c /coff /Cp %name%.bat
    %MLINK% /SUBSYSTEM:WINDOWS /FIXED:NO %name%.obj
    del *.obj
    ) ELSE ( 
      ECHO Cannot find %linkname% !
   )
) ELSE ( 
  ECHO Cannot find %cmpname% !
)       
exit /b %ERRORLEVEL%

我的问题:
例如,当尝试使用 GCC 时

;@goto end
#include <stdio.h>
int  main()
{ 
   return 0;
}
:end
;@echo off

set name=%~n0
set cmpname=gcc.exe
for %%I in (%cmpname%) do (set CMPL=%%~$PATH:I)
if defined CMPL (    
%CMPL% -Wall -o %name% %name%.bat
del *.obj
    ) ELSE ( 
    echo Cannot find %cmpname% !
    )
exit /b %ERRORLEVEL% 

第一个错误:
\CodeBlocks\MinGW\bin\gcc.exe 此时出乎意料。
我搜了一下,找到 this ,然后改成:

for %%I in (%cmpname%) do (set CMPL="%%~$PATH:I")

解决了,但是有一个新的错误:
testc.bat:文件无法识别: 文件格式无法识别 collect2.exe:错误:ld 返回 1 个退出状态

我的问题是:
是否有可能以及如何使上述批处理文件与 C/C++ 编译器一起使用?

【问题讨论】:

  • 抱歉,在我之前的回答中,我忽略了 C++ 语法的一个方面。这可以让它工作,有点。

标签: windows batch-file


【解决方案1】:

如果您愿意在文件系统中添加一个与其中一种原始类型匹配的额外无操作命令,您可以使用类似以下内容:

int /*
;@echo off
set name=%~n0
set cmpname=gcc.exe
for %%I in (%cmpname%) do (set CMPL=%%~$PATH:I)
if defined CMPL (    
%CMPL% -Wall -o %name% %name%.bat
del *.obj
    ) ELSE ( 
    echo Cannot find %cmpname% !
    )
exit /b %ERRORLEVEL% 
*/ dummy;
#include <stdio.h>
int  main()
{ 
   return 0;
}

未考虑多行 cmets 的早期答案: 你不能。

您可以制作一个将 C++ 代码传递给编译器的批处理文件,但它必须生成 C++ 代码;你不能制作一个既是有效批处理又是有效 c++ 的文件。

本质原因是C++没有任何停止处理文件的命令,而C++预处理器命令不能有除空格以外的任何前导字符。

这意味着您可以在 C++ 和任何将# 视为注释前缀的语言之间创建多身份文件。 (然后您只需在#if 0 ... #endif 中包含要以其他语言处理的整个脚本)。但是批处理不是这样的语言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2016-04-08
    • 2017-03-07
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多