2013-07-06 27 views
0

对于小件的汇编程序代码,我是非常舒适的把他们 在批处理文件,并直接或远程Windows机器编译。从批处理文件中调用并编译C代码?

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

;@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++编译器一起工作?

+0

对不起,我以前的答案,我忽略了C++语法的一个方面。这可以工作,有点。 –

回答

2

如果你愿意在你的文件系统,它匹配的原始类型之一放置额外的什么也不做的命令,你可以使用类似:它没有考虑

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; 
} 

早些时候答案多行注释: 你不能。

你可以说,通过C++代码,编译一个批处理文件,但它会生成C++代码;你不能创建一个有效的批处理文件和有效的C++文件。

的基本原因是,C++没有任何命令停止处理一个文件,和C++预处理器命令不能有除了空白任何前导字符。

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

相关问题