在Windows

时间:2015-06-05 08:02:47

标签: c windows gcc popen system-calls

我正在尝试编写一个程序来调用gcc来编译和链接在我的程序中构建的C文件。但是,如果我尝试使用以下方法调用gcc:

system("gcc -g -Wall build.c -o build.exe");

或更好(因为我想从gcc管道输出):

popen("gcc -g -Wall build.c -o build.exe", "r");

我得到的是我认为的链接错误:

/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../lib/libcygwin.a(libcmain.o): In function `main':
/usr/src/debug/cygwin-2.0.2-1/winsup/cygwin/lib/libcmain.c:39: undefined reference to `WinMain'
/usr/src/debug/cygwin-2.0.2-1/winsup/cygwin/lib/libcmain.c:39:(.text.startup+0x7f): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `WinMain'
collect2: error: ld returned 1 exit status

我通过使用特定于Windows的ShellExecute来缓解此问题:

HINSTANCE hRet = ShellExecute(
        0,
        NULL,
        "cmd.exe",
        "/c gcc -g -Wall build.c -o build.exe",
        NULL,
        SW_HIDE);

这样运行一切正常,但是,使用ShellExecute不允许我管道输出以查看文件是否正确编译,并且我希望有一个跨平台非Windows特定方式来执行此操作,因此使用Windows函数CreateProcess是不受欢迎的,我读过popen应该让我这样做。

我在PATH变量中定义了gcc的路径,它可以从cmd正确运行。

我错过了一个基本概念,还是有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

哇。我现在感觉很糟糕......

我从未关闭build.c文件!因此gcc无法编译它。

感谢您的帮助,这可能对我的愚蠢有帮助!