文章目录

  • 一.前言
  • 二.须知
  • 三.MinGW下载
  • 四.安装器安装
  • 五.出现的问题
  • 六.解压安装
  • 七.MinGW的使用
  • 八.如何生成动态链接库
  • 九.编译器 cc、gcc、g++、CC 的区别

一.前言

要知道,GCC 官网提供的 GCC 编译器是 无法直接安装到 Windows 平台上的,如果我们想在 Windows 平台使用 GCC 编译器,可以安装GCC 的移植版本

  • 目前适用于 Windows 平台、受欢迎的 GCC 移植版主要有 2 种,分别为MinGW 和 Cygwin
  • MinGW 侧重于服务 Windows 用户可以使用 GCC 编译环境,直接生成可运行 Windows 平台上的可执行程序,相比后者体积更小,使用更方便
  • Cygwin 则可以提供一个完整的 Linux 环境,借助它不仅可以在 Windows 平台上使用 GCC 编译器,理论上可以运行 Linux 平台上所有的程序。有更高的需求(例如运行 POSIX应用程序),就选择安装 Cygwin。

仅 Windows 平台上使用 GCC,可以使用 MinGW 或者 Cygwi

二.须知

注意搭建GCC编译环境时,一定要选择正确的GCC编译版本(32位和64位)。如果你本地安装的JDK是64位的,那么选择64位GCC,否则选择32位。这是为了使得编译后的库文件跟JVM的位一致,否则后面JVM无法调用dll(或so)而抛出异常

java.lang.UnsatisfiedLinkError: E:\dev_tools\jdk\jdk1.8.0_181\bin\HelloJNI.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

因此

  1. Linux下编译后的可执行文件只能在Linux下运行,Windows编译后的程序只能在Windows下运行。
  2. 64位的Linux编译后的程序只能在64位Linux下运行,32位的Linux编译后的只能在32位的Linux下运行。
  3. 32位Windows编译后的程序可以在64位或32位下windows下运行,64位windows编译后的程序只能在64位windows下运行。

三.MinGW下载

http://sourceforge.net/projects/mingw/  #32位
https://sourceforge.net/projects/mingw-w64/  #64位
  • 链接:https://pan.baidu.com/s/11Ad8R9yeNRZk4uoEHuYOvw
  • 提取码:e0n9
  • 64位、32位的都有

四.安装器安装

1.打开下载好的mingw-get-setup.exe ,这里选择安装目录为E:\dev_tools\MinGW

2.下载安装gcc/g++

  • 通过MinGW Installation Manager下载gcc/g++。勾选mingw32-gcc-g++-bin,点击Apply Changes,下载安装gcc/g++

  • 为使 GCC 同时支持编译 C 语言和 C++,需勾选上图图中标注的 2 项。我们知道,GCC 还支持其它编程语言,读者可借助此配置器,随时实际需要安装自己需要的编译环境。勾选完成后,在菜单栏中选择Installation -> Apply Changes,弹出如下对话框:

3.配置环境变量

  • 打开控制面板 -> 系统和安全 -> 系统 ->高级系统设置 -> 环境变量。
  • ​ 编辑系统变量Path,添加一个环境变量E:\dev_tools\MinGW\bin,具体为MinGW根目录下的\bin目录,用英文分号 ;隔开。

4.检验是否成功下载安装gcc/g++

  • 打开cmd终端,输入gcc -vg++ -v检验gcc与g++是否安装并配置变量成功。若如下图所示,则成功。

五.出现的问题

1.在步骤2(下载安装gcc/g++)时,出现部分package无法成功下载:

  • 具体是因为URL丢失libgmp-6.1.2-2-mingw32-dll-10.tar.xzlibmpfr-3.1.5-1-mingw32-dll-4.tar.xz,两个package包,从而导致在进行g++编译的时候出现重要组件libgmp-10.dlllibmpfr-4.dll的丢失。


解决方案:

  • ​ 跟已经下载安装好的同学拷贝这2个package包,又或者从搭配有MinGW的轻便型IDE如Dev-cpp、Code Blocks路径下拷贝这两个package包,其路径为MinGW根目录下的\var\cache\mingw-get\packages。
    ​ 然后解压缩这两个压缩包,将其中的组件libgmp-10.dlllibmpfr-4.dll复制到MinGW根目录下的\bin

六.解压安装

  1. 点击下面箭头指向的链接,在官网下载连接速度可能会非常慢…在这个链接下载会好很多。

  2. 下载好之后,解压,得到下图文件:

    可以看到bin文件夹里面有g++.exe和gcc.exe

3.配置环境变量

  • 打开控制面板 -> 系统和安全 -> 系统 ->高级系统设置 -> 环境变量。
  • ​ 编辑系统变量Path,添加一个环境变量E:\dev_tools\MinGW64\bin,具体为MinGW根目录下的\bin目录,用英文分号 ;隔开。

4.检验是否成功下载安装gcc/g++

  • 打开cmd终端,输入gcc -vg++ -v检验gcc与g++是否安装并配置变量成功。若如下图所示,则成功。

七.MinGW的使用

以运行一个 C 语言程序为例(存储路径为:D:\demo.c)

#include <stdio.h>
#include <stdlib.h>
int main(){printf("Hello, World!");system("pause");return 0;
}

在此基础上,在命令行窗口中执行如下指令:

C:\Users\mengma>gcc D:\demo.c -o D:\demo.exe

其会在 D 盘生成一个 demo.exe 可执行文件,找到该文件并双击,即可看到程序的执行结果:

Hello, World!

八.如何生成动态链接库

在gcc环境准备好的条件下,接下来使用下面的命令将c生成dll动态链接库:

gcc -m64 -Wl,--add-stdcall-alias -I"D:\Program Files\Java\jdk1.8.0_261\include"
-I"D:\Program Files\Java\jdk1.8.0_261\include\win32"
-shared -o MyNativeDll.dll JniTestImpl.c

简单的解释一下各个参数的含义:

  • -m64 :将c代码编译为64位的应用程序
  • -Wl,--add-stdcall-alias:-Wl表示将后面的参数传递给连接程序,参数--add-stdcall-alias表示带有标准调用后缀@NN的符号会被剥掉后缀后导出
  • -I:指定头文件的路径,在生成的头文件代码中引入的jni.h就在这个目录下
  • -shared:指定生成动态链接库,如果不使用这个标志那么外部程序将无法连接
  • -o:指定目标的名称,这里将生成的动态链接库命名为MyNativeDll.dll
  • JniTestImpl.c:被编译的源程序文件名,当前文件为c

在指令的执行过程中,都做了什么事呢,可以参考下面这张图:

在执行过程中,以.c源代码.h头文件作为源文件,先进行了预处理、编译、汇编的操作,图中省略了这一阶段产生的一些中间文件,编译完成后生成的.o二进制文件相对重要,依赖这个文件,最终生成动态链接库。

九.编译器 cc、gcc、g++、CC 的区别

  • gcc 是GNU Compiler Collection,原名为Gun C语言编译器,因为它原本只能处理C语言,但gcc很快地扩展,包含很多编译器(C、C++、Objective-C、Ada、Fortran、 Java),可以说gcc是GNU编译器集合

  • g++ 是C++编译器

  • cc 是 Unix系统C Compile,一个是古老的 C 编译器。而Linux 下 cc 一般是一个符号连接,指向 gcc;可以通过 $ ls -l /usr/bin/cc来简单察看,该变量是 make 程序的内建变量,默认指向 gcc 。 cc 符号链接和变量存在的意义在于源码的移植性,可以方便的用 gcc 来编译老的用cc编译的Unix软件,甚至连 makefile 都不用改在,而且也便于 Linux 程序在 Unix下 编译。
    CC 则一般是 makefile 里面的一个名字标签,即宏定义,表示采用的是什么编译器(如:CC = gcc)。

误区一:gcc只能编译C代码,g++只能编译C++代码。

gcc两者都可以,但请注意:

  • 后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是C++程序,注意,虽然C++是C的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些。
  • 编译阶段,g++会调用gcc,对于C++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。

误区二:gcc不会定义__cplusplus宏,而g++会

  • 实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。

误区三:编译只能用gcc,链接只能用g++

  • 严格来说,这句话不算错误,但是它混淆了概念,应该这样说:编译可以用gcc/g++,而链接可以用g++或者gcc -lstdc++。因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。但在编译阶段,g++会自动调用gcc,二者等价。

MinGW下载和安装教程
windows下安装MinGW及C++的环境配置

【开发工具】Window下MinGW下载安装gcc,g++编译器相关推荐

  1. Window10-MinGW下载安装gcc,g++编译器

    文章目录 完成流程步骤: 出现的问题: 完成流程步骤: 1.MinGW下载 MinGW官网 mingw-get-setup.exe下载地址 2.MinGW安装 打开下载好的mingw-get-setu ...

  2. 【操作系统】HarmonyOS App开发工具HUAWEI DevEco Studio下载安装及第一个HarmonyOS App实战教程

    路标 DevEco Studio简介 DevEco Studio的下载安装 安装过程演示 开发第一个基于Java的TV App 微信公众号原文链接:点击查看 2020年9月10日,华为开发者大会发布了 ...

  3. 【Linux】Linux 基础开发工具(yum、vim、gcc/g++、gdb、make/makefile、git)

  4. Python 开发工具推荐,以及下载、安装和设置

    您的"关注"和"点赞",是信任,是认可,是支持,是动力- 如意见相佐,可留言. 本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新. 本文首发在IT羊 ...

  5. PB安装包,PB安装程序,PB开发工具,powerbuilder安装包,powerbuilder安装程序,powerbuilder开发工具下载地址

    B安装包,PB安装程序,PB开发工具,powerbuilder安装包,powerbuilder安装程序,powerbuilder开发工具下载地址 如果不能打开请复制网址粘贴到浏览器中 http://p ...

  6. 【Linux】基础开发工具的简单使用——yum/vim/gcc/gdb/make/git

    文章目录 yum -- 软件包管理器 yum list -- 查看软件包 yum install -- 安装软件 yum remove -- 卸载软件 vim -- 文本编辑器 正常模式 底行模式 v ...

  7. linux交叉编译出现的问题,,Ubuntu 14.10下安装GCC交叉编译器遇到问题及解决方法

    Ubuntu 14.10下安装GCC交叉编译器遇到问题及解决方法 一.下载gcc-arm-none-eabi-4_9 安装成功后上报错误: ./gcc-arm-none-linux-gnueabi-g ...

  8. Linux~一些基本开发工具的使用(yum,vim,gcc,gdb,makefile)

    目录 一.yum--安装软件 二.Vim--文本编辑器 (1).命令模式 (2).底行模式 (3).插入模式 tips:给对应用户配置sudo命令 一些注意事项 三.gcc/g++--编译器 (1). ...

  9. 安装MinGW win安装gcc

    安装MinGW win安装gcc 1. 安装winGW: 2. 测试gcc安装结果: 3.MinGW-w64下安装报错the file has been downloaded incorrectly ...

  10. Linux_linux基础命令(增删查,权限,Linux下的重要目录,重要命令(. du, df, top, free, pstack, su, sudo).安装gcc/g++, gdb, vim )

    r:表示可读w:表示可写x:表示可执行也可以用数字表示这一点我们会在修改文件权限说明.对于文件夹的rwx表示:r表示可读及可以查看文件夹内容可以ls查看w表示可写及可以向文件夹中传送内容如文件x表示可 ...

最新文章

  1. 厉害了!一个Nvidia PC可运行四个Vives
  2. linux getty命令 开启 初始化 设置 终端 简介
  3. python3哪个教程好-Python3 教程
  4. Boost Asio总结(12)class basic_socket_acceptor
  5. [导入]Ms Ajax Lib- Object 类型扩展
  6. 001 java_001Java开发环境
  7. Python中defaultdict用法
  8. Ubuntu更改hosts档
  9. org.n3r.idworker idworker-client生成唯一id
  10. python读取excel_Python简单读取Excel示例
  11. python 命名风格_python 代码风格------------PEP8规则
  12. 如何彻底删除电脑上的软件
  13. SDN控制器Ryu、Floodlight、OpenDayLight的安装以及Mininet连接
  14. 【IoT】什么是动态密码及其用途
  15. OneDrive无法打开登陆怎么办
  16. OpenHarmony轻量系统开发【11】移植MQTT
  17. php 两个时间戳相隔小时数,php 计算两个时间戳相隔的时间实例
  18. cs231n Assignment1--机器学习基本方法与深度学习尝试
  19. 快速实现抖音的分享登录(android) 1
  20. 花椒直播列港台为国家被约谈;苏宁云商更名为“苏宁易购”;扎克伯格资产缩水33亿美元丨价值早报

热门文章

  1. 清华linux网络编程视频,清华大学视频课件:基于Linux的C++(自主模式)
  2. 【STM32】UART串口通信无法通信问题(SSCOM)
  3. 直播盒子APP源码AlijuheCMS™开发手册之接口文档 for IOS
  4. Vulkan-NCNN 编译
  5. C4D四视图切换及基本操作
  6. 组态王登录服务器为空,组态王客户端与服务器失去联系
  7. readelf命令使用
  8. ISO27001:2013和ISO27001:2005的差异对比
  9. DSP 基于 TMS320F2803x 的 I2C 上的 PMBus 的软件应用
  10. 3D数学---坐标空间