全部, 这里需要一些帮助。我来自纯粹的Java背景,对C编程知之甚少。基本上我需要编写一个C程序(并创建一个可执行文件),它将在Windows机器上输出自由字节数(RAM)(XP / 2008/7)
我对它进行了一些研究,发现有一个名为GlobalMemoryStatusEx的函数,还有一个链接: http://msdn.microsoft.com/en-us/library/aa366589(v=vs.85).aspx
我已经用gcc安装了cygwin,上面的程序甚至都没有为我编译。我知道我在做一些愚蠢的事情......
$ gcc hello.c -o hello.exe
hello.c:3:19: error: tchar.h: No such file or directory
hello.c: In function `main':
hello.c:7: error: `MEMORYSTATUSEX' undeclared (first use in this function)
hello.c:7: error: (Each undeclared identifier is reported only once
hello.c:7: error: for each function it appears in.)
hello.c:7: error: expected `;' before `statex'
hello.c:9: error: `statex' undeclared (first use in this function)
非常感谢任何帮助!
答案 0 :(得分:5)
正如larsmans所说,cygwin不是Windows本机编译器。除了MinGW,您还可以考虑Visual C++ 2010 Express。
答案 1 :(得分:3)
Cygwin默认在Windows上模拟Unix API,而不是呈现Windows API。
使用MinGW软件包可能会取得更大成功,该软件包是适用于Windows + Windows API的GCC。
答案 2 :(得分:3)
如果您不熟悉C,并且您想要做的就是为Windows编写这个小程序,您可能会发现开始使用免费Visual C++ Express更容易。有可能MSDN示例将开箱即用。
编辑:您提到了Java,但目前还不完全清楚是否要从Java调用此C应用程序的唯一目的。如果是的话,我想我会提到一些名为JNative的东西。它似乎是一个纯Java库,其中包含a wrapper for GlobalMemoryStatusEx。请注意,我通过Google搜索找到了JNative,但我自己没有使用它。
答案 3 :(得分:2)
您引用的函数是Windows API函数,这意味着您无法从cygwin调用该函数,cygwin是Windows上的POSIX仿真层。
此时您有几个选择:
请注意,所有Microsoft编译器都支持整个Win32 API。 MinGW在Windows上对Unicode的处理是有限的,它不支持COM(因此,如果你想调用COM API,这很麻烦),并且它不包括Windows SDK附带的所有头文件。
GCC是一个很棒的编译器,它在Windows支持方面并不是那么好。
答案 4 :(得分:1)
所提供的答案是正确的,但我不认为他们能够正确解释问题。
Unix和类Unix操作系统努力遵循名为POSIX的标准API。 Windpws不符合POSIX。 Cygwin是为在Windows上提供POSIX合规性而编写的。因此,当您在Cygwin上编译时,您正在编译POSIX API,而不是Windows API。您在MSDN上找到的功能在POSIX中不存在。所以,你得到编译错误。
MinGW是gcc移植到Windows。它知道Windows API的正确包含。 Visual Studio的nmake在这方面是相同的(提供对Win API的访问)。
答案 5 :(得分:1)
要使用cygwin gcc使用Win32 API编译程序,您需要mingw-i686-headers
包(包括tchar.h
等头文件。)
然后,您可能还需要define some macros to enable newer APIs。