美文网首页
CUDA02_01Window10C开发环境

CUDA02_01Window10C开发环境

作者: 杨强AT南京 | 来源:发表于2020-01-16 08:44 被阅读0次

  算算差不多6年时间没有玩过Window了,从DOS3.0开始,到Window3.1,到Window95,NT,Window ME,WindowXP,Window 2000 Server。后面的就没有正经使用过Window。开发工具,从Microsoft C++ 4到 VC++6.0,用过C++ Builder,VB,PB,ASP,DCOM,Win32, MFC,ActiveX,OLE,VBA,DirectX,C#,.......。当年也是微软的拥揼者,微软一直想像IBM,Oracle一样分杯企业市场,遗憾的是还是没有成功,还是在个人市场独大。
  这个主题整理下微软C/C++开发的环境。主要回顾了cl,link,lib,nmake几个工具的使用。


Window的C++编译器

  • Window下C++编译器能选择的常见就两款
    1. Microsoft C++ Compiler
      • 通过安装VStudio可以得到;
    2. MinGW C++ Compiler
      • 下载路径:http://www.mingw.org/category/wiki/download
      • 其他API库下载:https://osdn.net/projects/mingw/releases/
      • 使用下载管理器完成安装也可:https://osdn.net/projects/mingw/downloads/68260/mingw-get-setup.exe/
    • 注意:
      • 在Window下,我们还是使用微软家的Visual Stduio IDE吧。

Microsoft Compiler编译器与开发工具使用

编译器相关工具

  • Microsoft的编译工具包含三个核心工具

    1. 编译器cl
    2. 连接器link
    3. 库生成工具lib
  • 测试编译器的代码

    • 文件名:c01_readbmp.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[]){
    // 打开文件
    FILE* file = fopen("gpu.bmp", "rb");
    // 判定文件是否打开成功
    if(!file){
        printf("打开文件失败!\n");
        exit(EXIT_FAILURE);
    }
    printf("打开文件成功!\n");
    // 读取文件的前两个字节
    unsigned char c_magic[3] = {0};
    size_t sz_return = fread(c_magic, 1, 2, file); 
    printf("读取的字节数:%zd\n", sz_return);

    if(!strcmp(c_magic, "BM")){
        printf("文件是BMP文件!\n");
    }else{
        printf("文件不是BMP文件!\n");
    }
    // 关闭文件
    fclose(file);
    return 0;
}

  • 最简单的编译链接:

    • cl c01_readbmp.c
    • 直接生成与源代码一样文件名的exe执行文件。


      编译链接产生执行文件
  • 学习微软编译器的最好方法就是去VS IDE工具中找对应的设置;


    这些命令行在IDE中都可视化配置
  • 下面分开来解释下链接编译过程
  1. cl编译器
  • 编译器工作包含两个阶段:

    • 预编译(处理宏替换与预处理指令)
    • 编译(编译成目标文件.obj文件)
  • 下面演示都是在VS IDE提供的环境中执行:

    • 意味着INCLUDE与LIBPATH已经被设置。
  • 与编译只与头文件有关,并且检测语法

    • 与动态库与静态库无关;
  • 编译演示:

    • cl /c /Fo输出的目标文件名 源代码文件
    • cl /c /Foc01.obj c01_readbmp.c
    • 注意:
      1. 不适用/Fo会输出默认与源代码文件名相同的目标文件,扩展名是obj。
      2. /Fo与目标文件名之间不能有空格。


        预编译
  • 提示:

    • 使用/nologo可以去掉logo输出。可以看下面效果。
  • 预编译使用选项/E与/P,/EP

    1. /E直接输出到标准终端
    2. /P可以预编译输出到指定文件名的文件。
    3. /EP输出到标准终端,而且输出行号。


      预编译的结果
  • 提示:

    1. 一般预编译的文件的扩展名为i;
    2. 编译产生的汇编,扩展名为.s;
      • 使用/Fa选项:cl /Fac01.s /nologo c01_readbmp.c
    3. 目标文件扩展名为.obj;
  • 汇编编译结果


    编译产生的汇编代码
  1. link连接器
  • link链接器是直接生成可执行文件

    1. exe独立执行文件
      • 扩展名exe
    2. dll动态执行文件
      • 扩展名dll
  • 提示:

    1. 链接一般链接一个或者多个目标文件,生成执行文件;
    2. 链接需要执行文件需要的动态库与静态库;
    3. 静态库会链接成执行文件的一部分,效果等价于目标文件;
    4. 动态库在window中还需要导出符号表等信息。
  • 链接程序的例子:

    • link c01.obj /out:main.exe
      把目标文件链接成执行文件
  • link的其他用途:

    • 链接动态库

    • 导出符号表

    • 下面是帮助


      link的帮助
  1. lib库编译器
  • lib库编译器是编译成静态库。

    • 库的扩展名是lib
  • 提示:

    • lib编译的不是动态库,而是静态库;
    • 静态库的使用比动态库简单多了,这里不演示动态库了;
  • lib使用例子:

    • 查看静态库中内容:lib /list lib库文件
    • 归档目标文件为静态库:lib /out:输出库文件 目标文件 .......
      lib使用例子

编译辅助工具

  1. nmake工具
  • 这是一个解释执行Makefile脚本的工具。

    • 语法套路按照Makefile即可,使用与Unix相关的平台的make工具差不多。
  • 直接仿照Unix的Makefile编写脚本:

# 执行文件生成
main: c01_readbmp.obj
    @link  /nologo c01_readbmp.obj /out:main.exe

# 目标文件生成
c01_readbmp.obj:c01_readbmp.c
    @cl /nologo /c c01_readbmp.c

# 清除,错误定向到空设备
clean:
    @del  *.exe *.obj  *.i *.s *.lib  2>nul 

  • 执行编译
    • nmake main
    • nmake clean
      使用namke

附录

  1. 命令行开发环境
  • 使用IDE的可以不用关注这个:

    • 在Visual Studio的安装目录下,有一个专门设置C/C++开发环境的脚本,执行后可以不用设置各种环境了。尤其头文件目录,库文件目录。
    • C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\Tools\VsDevCmd.bat
  • 上面这个脚本是cmd的批处理脚本,只能在cmd控制终端使用。

  • VsDevCmd.bat会生成几个有用的环境变量,这几个环境变量影响着编译器的行为。

    • INCLUDE
    • LIBPATH
  • 不设置这两个环境变量,请使用编译命令行指定/I选项指定include的搜索路径吧。

  • 使用set指令,查看这两个环境变量:

    查看INCLUDE与LIBPATH环境变量
  1. VSCode下的源代码编码问题
  • 目测VSCode对UTF-8工作得不是很好,对UTF-8 BOM工作很好。
    • 如果出现如下编译警告,则设置编辑器的编码为UTF-8 BOM,记得关闭文件重新打开,或者重新建立文件。
      • 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失
  1. 关于cmd与powershell的选择
    • cmd及其脚本比较古典。
    • powershell明显模仿了bash或者csh,习惯Unix相关操作系统的,可以选择powershell。


      使用ls替代dir

相关文章

  • CUDA02_01Window10C开发环境

      算算差不多6年时间没有玩过Window了,从DOS3.0开始,到Window3.1,到Window95,NT,...

  • 2019-05-27

    基本每个项目都会有开发环境(本地环境)、开发集成环境、测试环境、预发布环境、正式环境。最少也有开发环境(本地环境)...

  • 什么是开发环境、测试环境、生产环境、UAT环境、仿真环境?

    项目开发过程中什么是开发环境、测试环境、生产环境、UAT环境、仿真环境? 项目开发过程中什么是开发环境、测试环境、...

  • ExpressionChangedAfterItHasBeenC

    开发环境 ‘ExpressionChangedAfterItHasBeenCheckedError’。 在开发环境...

  • Asp.net Core 环境选择

    环境选择:Production是生产环境Development是开发环境项目一般在发布前,都是开发环境。开发环境和...

  • 开发和发布相关的三个环境

    开发环境,开发人员使用 测试环境,测试人员使用 生产环境 开发环境和测试环境独立开,是为了测试进行的同时,开发可以...

  • 构建 Maven 环境隔离

    实际的项目环境: 本地开发环境(Local) 开发环境(Dev) 测试环境(Beta) 线上环境(Prod) 环境...

  • 从0到1搭建企业分布式系统-02-环境整理

    开头 首先对企业级系统进行一个环境梳理,主要分为开发环境、测试环境、生产环境,需要严格隔离 开发环境 开发环境主要...

  • web端区分不同的开发环境

    web端如何区分不同的开环境 前言 在项目开发中我们经常会遇到这个问题,本地开发环境,线下开发环境,预上线开发环境...

  • vue请求跨域问题解决

    production:产品 生产环境 development:开发 开发环境 1、开发环境设置跨域 使用工具:vu...

网友评论

      本文标题:CUDA02_01Window10C开发环境

      本文链接:https://www.haomeiwen.com/subject/aszxzctx.html