程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 編寫C語言開發環境——編譯模塊

編寫C語言開發環境——編譯模塊

編輯:關於C語言

    在winodws下C語言的編譯器,我並不熟悉,winTC下是有一些用於編譯C語言的程序,真心不熟,也不知道會遇到什麼問題。所以搜了一下windows下的Gcc,真的有這個移植,這下好辦了。windows下的GCC及G++被集成在mingw32中,連Gdb都有。下載解壓出來,就是linux編譯工具的win32版本。
        還有一個問題是自動生成makefile,在Linux下有autoconf及automake這兩個工具能實現,搜了一上午也沒找到win32版本的。只好放棄了makefile,直接用gcc的編譯,將所有的.c文件全編譯成.o文件,然後集中到一個debug文件夾中,進行鏈接。這個開發環境是面向初學者的,沒有makefile應該不會有太大的問題。
        在VC中調用dos命令調用Gcc來編譯,找到了三種調用方式,分別是
[cpp] 
System(LPCTSTR cmd); 
[cpp] view plaincopy
  UINT WINAPI WinExec( 
       __in          LPCSTR lpCmdLine, 
       __in          UINT uCmdShow 
    ); 
         以及
[cpp]
HINSTANCE ShellExecute(       
    HWND hwnd, 
    LPCTSTR lpOperation, 
    LPCTSTR lpFile, 
    LPCTSTR lpParameters, 
    LPCTSTR lpDirectory, 
    INT nShowCmd 
); 

          他們的區別在於
       system()在調用的時候會閃過一個dos窗口,不能用。
       winExec不能使用操作符,像重定向,管道等。不過可以通過第二個參數將窗口隱藏。
       shellExecute也能隱藏窗口,並且功能強大。一開始我想直接用shellExecute調用Gcc進行編譯,卻也不能使用操作符。後來調用cmd,其他命令用作參數,完全可以運行dos下的所有命令。
        Build_cmd=gcc+option+BUILD_OBJ+File_str+" 2>>"+dir+"\\stderr";
        block_ShellExecute(NULL,"open","cmd","/c "+Build_cmd,project_dir,SW_HIDE);
不過要注意,那些需要輸入的命令不可用,會進無限等待。另外,我還遇到了另一個問題,shellExecute並不是阻塞運行,因此可能第一步的.o文件還沒完成生成,就運行了鏈接導致出錯。一開始我用判斷.o文件是否完全生成來解決,這樣做還得先判斷是否編譯出錯,並不是一個好辦法。後來找到了一個更好的解決辦法,通過判斷進程是否退出來實現阻塞,代碼如下:
[cpp] 
void block_ShellExecute(HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,INT nShowCmd) 

    SHELLEXECUTEINFO si; 
    ZeroMemory(&si, sizeof(si)); 
    si.cbSize = sizeof(si); 
    si.fMask = SEE_MASK_NOCLOSEPROCESS; 
    si.hwnd=hwnd; 
    si.lpVerb = _T(lpOperation); 
    si.lpFile = _T(lpFile); 
    si.lpParameters=_T(lpParameters); 
    si.lpDirectory=_T(lpDirectory); 
    si.nShow = nShowCmd; 
     
    ShellExecuteEx(&si); 
     
    DWORD dwExitCode; 
    GetExitCodeProcess(si.hProcess,&dwExitCode); 
    while (dwExitCode == STILL_ACTIVE) 
    { 
        Sleep((DWORD)5); 
        GetExitCodeProcess(si.hProcess, &dwExitCode); 
    } 
     
    CloseHandle(si.hProcess); 

        作者:AstrayLinux

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved