cygwin 可以说是大名鼎鼎 ,卖点是在windows 系统上给你linux 的使用体验。喜欢使用linux的朋友在只有windows 可用的情况下,装个cygwin,打开cygwin 的命令行就可以敲击linux命令,感觉爽歪歪。 问题是 在cygwin环境下能编译c代码吗?编译后的东东是原生的windows程序吗?
minGW (minimium Gnu for Windows)也是个响当当的自由软件项目,号称windows上的Gnu, 它与cygwin又有什么区别呢?
cygwin主页: http://www.cygwin.org/
minGW 主页: http://www.mingw.org/
-
cygwin和minGW比较
下面我们分别使用它们,编译并运行一个helloworld程序,看看它们的差别。
到 http://sourceforge.net/projects/mingw/files/ 下载最新的Download mingw-get-inst-YYYYmmDD.exe ,然后安装,比如安装到E:\MinGW\
到http://www.cygwin.com/ 下载最新的 setup-x86.exe(32机)或者 setup-x86_64.exe( 64位机),然后点击安装,比如安装到 D:\cygwin1.7
1. 双击cygwin快捷方式进入命令行窗口,编辑以下文件(HelloWorld.c)
#include <stdio.h>
main(){
printf("Hello,world!\n");
}
然后执行
cc -o HelloWorld HelloWorld.c会生成HelloWorld.exe , 大小大约是12.1k字节。
在cygwin命令行下执行HelloWorld.exe,会正确地打印出 Hello, world!
2.双击minGWshell快捷方式进入命令行窗口,编辑HelloWorld.c , 内容与上边的HelloWorld.c相同。
然后执行 cc -o HelloWorld HelloWorld.c
注意也会生成一个HelloWorld.exe , 大小大约是46.9k字节。
大小差别很大!!
在minGW命令行下执行HelloWorld.exe,也会正确地打印出 Hello, world!
3. 在windows命令行执行 或者explorer下点击在cygwin下生成的HelloWorld.exe,会报错:没有找到cygwin1.dll,因此应用程序未能启动。
在windows命令行下执行 minGW生成的HelloWorld.exe,则会正确地打印出 Hello, world!
为什么呢?
根本原因在于 minGW 可以在Windows平台生成本地的Windows程序而不需要第三方C运行时库;
而cygwin 生成的程序是借助于cygwin的运行库来运行windows程序。这就是cygwin下的程序不能单独运行的原因。
cygwin的系统调用都是通过cygwin运行库的这个二传手来进行的,这似乎解释了为什么刚才的HelloWorld.exe程序比minGW下的小的原因。
为了验证我们的想法,找到cygwin1.dll (cygwin\bin目录)将其放到cygwin下包含生成的HelloWorld.exe目录下,再次在windows命令行中执行: HelloWold.exe
可以看到 执行成功。
由此,相对cygwin, minGW更适合来生成windows下的c程序,因为可独立打包,不依赖于第三方运行库。
*** 缺省的minGW下载包只能编译win32程序 其结果不能用在64bit的windows上。******
要编译64bit的windows上的C/C++程序需要minGW-w64 (http://sourceforge.net/projects/mingw-w64/),minGW-w64只有源码,需要重新build才能使用,过程比较麻烦。可以考虑使用TDM-GCC,既可编译32bit也可编译 64位,它包含了minGW和minGW-w64的功能,下载安装即可使用,下载网址:http://tdm-gcc.tdragon.net/
-
用minGW来生成dll库并被JNI程序使用
看看如何使用TDM-GCC安装的 minGW-64 来编译C程序生成dll,并被JNI 程序使用。
以64bit Windows为例:
进入TDM-GCC安装的minGW64命令行:
1.创建一个Java类: HelloWorld.java
public class HelloWorld {
//declare the JNI method
public native double sum(double x,double y);
static{
System.loadLibrary("sum");
}
public static void main(String[] args){
System.out.println(new HelloWorld().sum(3.3,6.7));
}
}
2.编译HelloWorld.java (javac HelloWorld.java)
3.生成HelloWorld 使用JNI的头文件 (javah HelloWorld)
4.创建一个C程序 :sum.c
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT jdouble JNICALL Java_HelloWorld_sum(JNIEnv *env,jobject obj,jdouble a,jdouble b){
printf("Hello,world!\n");
return a+b;
}
5.利用minGW64由 sum.c 生成dll:
gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -I%JAVA_HOME%/include -I%JAVA_HOME%/include/win32 -shared -o sum.dll sum.c
6.执行java HelloWorld :
可以看到命令行输出 :
Hello,World!
10.0
如果在32bit windows上运行,进入minGW shell,执行以上步骤即可。