【问题标题】:gcc/g++ gives me error "CreateProcess: No such file or directory"gcc/g++ 给我错误“CreateProcess:没有这样的文件或目录”
【发布时间】:2011-03-30 18:28:30
【问题描述】:

-edit- 似乎是路径问题,无法找到它的 bin/ 文件夹。即使 g++ 在那个 bin 目录中。

我正在尝试在我的应用程序的 Windows 上启动 g++,但出现以下错误。我如何解决它?旁注我可以在提示符中执行g++ dummy.cpp 没有问题。

参数-o file.exe -x c++ -

标准输出

: CreateProcess: No such file or directory

-edit- 我的代码是...

#include <windows.h> 
#include <stdio.h> 
#include <strsafe.h>

#include <ios>
#include <iostream>
#include <fstream>
#include <sstream>
#include <exception>
#include <string>
#include <deque>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

string gcc_bin="E:/dev/external/MinGW/bin/g++.exe";
string gcc_folder="E:/dev/external/MinGW/bin/";

int launch_gcc(ostringstream&o);
int main(){
    ostringstream osz;
    osz << "#include <cstdio>" << endl << "int main(){ printf(\"hello\"); } return 4; }";
    {
        launch_gcc(osz);
    }
    return 0;
}





void ErrorExit(PTSTR);
int launch_gcc(ostringstream&o)
{

    char buf2[4096];
char buf[4096];
ExpandEnvironmentStrings("%PATH%", buf, 4095);
OutputDebugString(buf);

    sprintf(buf2, "PATH=%s;%s;\0\0", gcc_folder.c_str(), buf);

    STARTUPINFO startupInfo;
    PROCESS_INFORMATION processInformation;

    HANDLE g_hChildStd_IN_Rd = NULL;
    HANDLE g_hChildStd_IN_Wr = NULL;
    HANDLE g_hChildStd_OUT_Rd = NULL;
    HANDLE g_hChildStd_OUT_Wr = NULL;
    HANDLE g_hChildStd_ERR_Rd = NULL;
    HANDLE g_hChildStd_ERR_Wr = NULL;

    HANDLE g_hInputFile = NULL;

    SECURITY_ATTRIBUTES saAttr;  
    saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
    saAttr.bInheritHandle = TRUE; 
    saAttr.lpSecurityDescriptor = NULL; 

    if ( ! CreatePipe(&g_hChildStd_OUT_Rd, &g_hChildStd_OUT_Wr, &saAttr, 0) ) 
    ErrorExit(TEXT("StdoutRd CreatePipe")); 
    if ( ! SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0) )
    ErrorExit(TEXT("Stdout SetHandleInformation"));

    if ( ! CreatePipe(&g_hChildStd_ERR_Rd, &g_hChildStd_ERR_Wr, &saAttr, 0) ) 
    ErrorExit(TEXT("StderrRd CreatePipe")); 
    if ( ! SetHandleInformation(g_hChildStd_OUT_Rd, HANDLE_FLAG_INHERIT, 0) )
    ErrorExit(TEXT("Stderr SetHandleInformation"));

    if (! CreatePipe(&g_hChildStd_IN_Rd, &g_hChildStd_IN_Wr, &saAttr, 0)) 
    ErrorExit(TEXT("Stdin CreatePipe")); 
    if ( ! SetHandleInformation(g_hChildStd_IN_Wr, HANDLE_FLAG_INHERIT, 0) )
    ErrorExit(TEXT("Stdin SetHandleInformation")); 

    ZeroMemory( &startupInfo, sizeof(STARTUPINFO) );
    startupInfo.cb = sizeof(STARTUPINFOA); 
    startupInfo.hStdError = g_hChildStd_OUT_Wr;
    startupInfo.hStdOutput = g_hChildStd_ERR_Wr;
    startupInfo.hStdInput = g_hChildStd_IN_Rd;
    startupInfo.dwFlags |= STARTF_USESTDHANDLES;

    ZeroMemory( &processInformation, sizeof(PROCESS_INFORMATION) );

    bool bSuccess = CreateProcess(
        gcc_bin.c_str(),
        " -o \"c:/dev/src/git/myprj/theout.exe\" -x c++ -",
0,
  0,
  1,
  NORMAL_PRIORITY_CLASS,
  0,//buf2,
  0,//gcc_folder.c_str(),
  &startupInfo,
  &processInformation
);
   if ( ! bSuccess ) 
      ErrorExit(TEXT("CreateProcess"));
   else 
   {
      // Close handles to the child process and its primary thread.
      // Some applications might keep these handles to monitor the status
      // of the child process, for example. 

      CloseHandle(processInformation.hProcess);
      CloseHandle(processInformation.hThread);
   }


    { 
    DWORD dwRead, dwWritten; 
    BOOL bSuccess = FALSE;

    auto sz=o.str();
    bSuccess = WriteFile(g_hChildStd_IN_Wr, sz.c_str(), sz.size(), &dwWritten, NULL);
    //if ( ! bSuccess ) break; 

    if ( ! CloseHandle(g_hChildStd_IN_Wr) ) 
        ErrorExit(TEXT("StdInWr CloseHandle")); 
    } 



    #define BUFSIZE 1024*4
    { 
    DWORD dwRead, dwWritten; 
    CHAR chBuf[BUFSIZE]; 
    BOOL bSuccess = FALSE;
    HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

    chBuf[0]=0;
    if (!CloseHandle(g_hChildStd_OUT_Wr)) 
        ErrorExit(TEXT("StdOutWr CloseHandle")); 

    for (;;) 
    { 
        bSuccess = ReadFile( g_hChildStd_OUT_Rd, chBuf, BUFSIZE, &dwRead, NULL);
        if( ! bSuccess || dwRead == 0 ) break; 

        bSuccess = WriteFile(hParentStdOut, chBuf, 
                            dwRead, &dwWritten, NULL);
        chBuf[dwWritten]=0;
        if (! bSuccess ){ 
            printf("%s", chBuf);
            break; 
        }
    } 
    }

    { 
    DWORD dwRead, dwWritten; 
    CHAR chBuf[BUFSIZE]; 
    BOOL bSuccess = FALSE;
    HANDLE hParentStdErr = GetStdHandle(STD_ERROR_HANDLE);

    if (!CloseHandle(g_hChildStd_ERR_Wr)) 
        ErrorExit(TEXT("StdOutWr CloseHandle")); 

    for (;;) 
    { 
        bSuccess = ReadFile( g_hChildStd_ERR_Rd, chBuf, BUFSIZE, &dwRead, NULL);
        if( ! bSuccess || dwRead == 0 ) break; 

        bSuccess = WriteFile(hParentStdErr, chBuf, 
                            dwRead, &dwWritten, NULL);
        chBuf[dwWritten]=0;
        if (! bSuccess ){ 
            printf("%s", chBuf);
            break; 
        }
    }
    auto a=1;
    }


    return 0;
}

void ErrorExit(PTSTR lpszFunction) 
{ 
    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;
    DWORD dw = GetLastError(); 

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );

    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
        (lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); 
    StringCchPrintf((LPTSTR)lpDisplayBuf, 
        LocalSize(lpDisplayBuf) / sizeof(TCHAR),
        TEXT("%s failed with error %d: %s"), 
        lpszFunction, dw, lpMsgBuf); 
    MessageBox(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK); 

    LocalFree(lpMsgBuf);
    LocalFree(lpDisplayBuf);
    ExitProcess(1);
}

【问题讨论】:

  • 它可能有助于发布用于从应用程序中调用 gcc 的代码。我怀疑您需要指定 gcc 可执行文件的完整路径,因为在命令解释器中很可能没有“搜索路径”。
  • 错误是否来自您的电话?据我了解 gcc/g++ 是如何工作的,他们启动了其他进程,可能是他们找不到这些进程。您的命令提示符是 g++ 工作的常规 Windows 命令提示符还是 Cygwin 的?
  • @lothar:完成。 @Alexey:在 cmd 中, g++ 有效。使用我的 C++ 代码(现已粘贴)。我运行它并得到错误。错误来自 g++ 标准输出。
  • 根据你的代码,错误不是来自gcc,而是来自你的代码:Your program can't start gcc。您是否尝试过在路径中使用反斜杠,例如:string gcc_bin="E:\\dev\\external\\MinGW\\bin\\g++.exe";
  • @Alexey:是的,它也来自 gcc。否则我的函数会返回错误,而不是在标准输出中找到它。例如编辑文件夹,我会得到一个窗口消息,而不是从标准输出输出

标签: gcc g++


【解决方案1】:

尝试将g++编译器的路径添加到PATH环境变量中:

TCHAR *path;
TCHAR *newpath;
DWORD dwSize = GetEnvironmentVariable(TEXT("PATH"), NULL, 0);

path = new TCHAR[dwSize];
GetEnvironmentVariable(TEXT("PATH"), path, dwSize);


dwSize += MAX_PATH;
newpath = new TCHAR[dwSize];
_tcscpy_s(newpath, dwSize, TEXT("E:\\dev\\external\\MinGW\\bin;"));
_tcscat_s(newpath, dwSize, path);
SetEnvironmentVariable(TEXT("PATH"), newpath);

delete[] path;
delete[] newpath;

此时,您进程的环境块包含 PATH 变量,其中包含 g++ 编译器的路径。注意:这不会影响用户的环境。

您可以使用char 代替TCHARstrcpystrcat。这种方式适用于两种情况:启用 Unicode 和不支持 Unicode。

【讨论】:

    【解决方案2】:

    系统上很可能存在编译器的双重实例。

    如果是这样,请尝试以下方法进行实验,以便当前路径下的那个可以运行源编译:

    D:\cmn_dev\mingw64\bin>.\g++ HelloGcc.cpp -o Hello.exe
    

    希望这会有所帮助。问候。

    【讨论】:

      【解决方案3】:

      您使用的是哪个 GCC for windows? MinGW,Cygwin,还有什么?

      您是否尝试过按照此问题的指示再次登录和注销? CreateProcess: No such file or directory

      在 Windows 上,GCC 需要它的 bin 目录位于 PATH 上,它不会在自己的二进制目录中查找。尝试放置类似

      的内容
      wchar_t buf[4096];
      ExpandEnvironmentStringsW(L"%PATH%", buf, 4095);
      OutputDebugStringW(buf);
      

      在调用 g++ 之前进入您的程序,以确保该目录位于您的程序环境的路径上(如果您没有在调试器中运行您的程序,请改用 wprintf)

      如果您尝试将 GCC 安装在包含空格字符的路径上,请注意,MinGW 和 Cygwin 都会对此发出警告。

      【讨论】:

      • 我试过了,但也许我做错了。我在上面添加了我的代码。当我尝试执行我的 createproccess 时,添加 path=gcc_bin;path;\0\0 会导致错误 87 parameter is incorrect
      • “E:/dev/external/MinGW/bin”是否出现在 buf 中?如果没有,则需要将其添加到系统环境中(XP 上为support.microsoft.com/kb/310519,Vista/7 上为 windowskey->"environment")并重新登录和注销。
      • 其他人将不得不使用这个应用程序,我不想弄乱他们的环境变量。此外,正如我的代码所示,我将它添加到 ExpandEnvironmentStrings 中。只是我做错了,或者当我调用自己的 createproccess 时出现参数错误
      • 我忘了说。我确实在我的道路上重新启动了它,但没有运气。但是我没有在创建过程中使用 ExpandEnvironmentStrings,因为它给了我 87 参数不正确的错误
      • 我遇到了同样的问题,这个问题给出了一个很好的方向:在 cmd.exe 上:&gt; which g++.exe 输出 ...\avr8-gnu-toolchain\avr\bin\g++.exe 这肯定不会编译控制台应用程序。使用 MinGW/bin 目录添加 %path% 解决了这个问题。
      【解决方案4】:

      我遇到了同样的问题,在将“C:\MinGW\msys\1.0\bin”添加到 PATH 系统变量后得到了解决。

      【讨论】:

        【解决方案5】:

        使用 Sysinternals ProcessMonitor (http://technet.microsoft.com/en-us/sysinternals/bb896645) 跟踪您的代码发出的系统调用(CreateFile、CreateProcess、Registry 查询)及其成功和返回价值。这还显示了查找代码未找到的可执行文件的所有不同尝试 - 大多数情况下,这很明显,哪个错误(例如拼写错误、转义、路径中的空格等)导致代码找不到 g++ 可执行文件.

        【讨论】:

          【解决方案6】:

          像 BertNase 所说的那样使用 Sysinternals ProcessMonitor。您所做的是在“进程名称”列下找到正在编译的 .exe 名称,例如 gcc.exe。然后查看结果列,任何不成功的都检查出来。我认为您正在寻找的是 NAME NOT FOUND 结果。

          我遇到了同样的问题,并且按照我刚才提到的操作,我发现 gcc.exe 得到了 cc1obj.exe 的 NAME NOT FOUND 结果。所以我做了一个有根据的猜测,进入我的 MinGW 文件夹下 \libexec\gcc\mingw32\4.5.0 (版本号可能对你不一样)并制作了 cc1.exe 的副本,然后将其重命名为 cc1obj.exe .还有,这解决了问题。

          您可能没有丢失同一个文件,但听起来按照这个过程可以修复它。

          【讨论】:

            【解决方案7】:

            昨天我遇到了一个问题,程序无法处理这样的路径:

            <some stuff>;%ProgramFiles%\path\to\bins;<some other stuff>
            

            我将其替换为:

            <some stuff>;C:\Program Files\path\to\bins;<some other stuff>
            

            它奏效了。你可能想看看这个

            【讨论】:

              【解决方案8】:

              你得到的错误是 gcc "CreateProcess" 的函数试图访问一些文件但找不到它。

              很明显,如果 gcc 发现错误,它正在运行,所以你的 PATH 没有问题。

              但是 gcc 找不到编译所需的程序或库。这是我在 mingw32 上知道的一个奇怪的错误。我最好的建议是重新安装 mingw32。您可能更改了程序使用的某些文件。

              【讨论】:

                【解决方案9】:

                我在设置 Atom 时也遇到了这个问题。但后来我发现我的 MinGW 是从 Codeblocks 文件夹中复制的。通过官方 MinGW 安装程序重新安装软件包并在

                中添加目录路径(对于我的情况是 C:\MinGW\bin)

                高级系统设置>环境变量>路径

                帮我解决了问题

                【讨论】:

                  【解决方案10】:

                  旧线程但谁知道它可以提供帮助。

                  对我来说,我将完整路径替换为编译器的位置。

                  所以:

                  set path="< folder that contains the compiler>"
                  

                  我认为当前路径中可能有一些元素没有被编译器正确解析(没有双引号、没有空格等)

                  【讨论】:

                    猜你喜欢
                    • 2011-12-19
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-12-13
                    • 2012-10-30
                    • 2021-10-31
                    相关资源
                    最近更新 更多