最近在学 DirectX10,今天终于使用 MSVC (visual studio和visual c++使用的c/c++编译器) 成功编译了第一个示例程序。

先搞 DirectX:

查阅资料了解到,windows10其实是自带 DirectX12 ,但那只是运行时支持,而不是 DirectX SDK(软件开发工具包) 。所以需要自己下载 DirectX10。那就去 MSDN (算是微软官网)下载相关资源,得知 DirectX 的后续版本已经被整合到了 windows SDK 中,这个 SDK 占用空间很大,而且只能装在 C 盘。

幸好仍然提供旧版本的 DirectX SDK 下载,下载之后,安装在 E盘。


最重要的就是 include 和 lib 文件,里面就是头文件和相应的库文件。

最初的打算是使用 MinGW 的 g++ 命令编译 DirectX10 程序,但是经过多次尝试还是以失败告终,总是会有莫名奇妙的错误。只能换成 MSVC 。又通过查资料得知可以单独下载编译器,而不需要安装完整的visual studio IDE(众所周知,Visual Studio动辄好几个G,十分臃肿,最关键的是其中的许多东西其实是用不到的)。

具体方法是下载 visual c++ build tools ,在安装时只选择编译器即可。注意:无法选择安装路径。默认装到C盘。安装完成后一看,c盘又小了一个G,肯定又是安装了很多不需要的东西。 (ーー゛)

visual c++ build tools 安装完成后在开始菜单栏就会出现相应的命令行界面,选择 Visual C++ 2015 x64 Native Command Prompt(其他的工具可自行尝试), 最关键的是 cl 命令,这就是编译命令。

cl /EHsc /Fea.exe InitDirect3D.cpp d3dApp.cpp d3dUtil.cpp GameTimer.cpp

使用上述命令运行示例程序,此命令会将编译后的文件自动链接为exe文件

/EHsc 说明程序内部使用了异常处理,类似 Java 的 try catch 那种/Fe 重命名exe文件(默认是主函数所在程序名)

InitDirect3D.cpp 是程序入口,其余 cpp 文件是依赖文件。
使用预处理命令链接 lib 库,(此预处理命令 MinGW 是不支持的)

#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "dlib/d3d10.lib")
#pragma comment(lib, "dlib/d3dx10d.lib")

此示例程序使用了 Windows API,所以应包含有 windows.h 文件。

gdi32 user32 就是Windows API 的动态链接库,是 windows 自带的 dll 文件,d3d10 d3dx10d 是此程序使用到的静态链接库,我将它们从 DirectX 的 lib 文件夹拷贝到了项目的 dlib 文件夹中。

执行编译命令,一大堆报错。

首先是类型转换错误,比如:type ‘float’ unexcepted ,或者 cannot convert to … 等等;在网上找了一大堆资料,都没说到重点,有说把示例程序改成非 UNICODE 码的,还有说更改cpp文件保存时使用的字符集的。我在前两天刚看了 windows程序设计(第五版) 一书,再加上观察报错,认为这个错误是因为 UNICODE 的编码问题。也就是说函数参数要求非 UNICODE 码,但传入的是 UNICODE 码。

我想起在 windows 程序设计一书中作者这样写道: 如果程序中定义了名为 UNICODE 的宏,那么函数就处理 UNICODE 编码,如果没有定义,那就是非 UNICODE 码,比如 ASCII 码,或者扩展 ASCII 码。(实现此技术并不难,使用 #ifdef 对函数名进行条件宏替换就可以做到)

于是在include的头文件之前 定义了 UNICODE 宏,就像下面这样:

#ifndef D3DAPP_H
#define D3DAPP_H
#define UNICODE     //我自己加的,位于 d3dApp.cpp 文件中#include "d3dUtil.h"
#include "GameTimer.h"
#include <string>

再次编译错误少了一大半,剩下的错误是找不到某些 DirectX10 的头文件。
再次经过相当长时间的折腾,发现 MSVC 的include文件夹在:

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include

将头文件放入此文件夹即可。

注意: 编译信息提示缺什么再放什么,不要放多余的头文件,因为在

C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\um

文件夹下还有系统自带的 DirectX 头文件(为什么这里也有,奇怪(ーー゛))。所以如果两个地方有相同的头文件,就会引发 “宏重定义” 错误。当然,也可以直接将需要的头文件拷贝到项目中,只需将 include<> 改为 include"" (#include< >指示预处理程序到预定义的缺省路径下寻找文件;#include“ ”指示预处理程序先到当前目录下寻找文件,再到预定义的缺省路径下寻找文件。)

做完这一切,再次运行 cl 命令,终于看到了 a.exe,运行得到结果:


写在结尾: 其实到这就行了,但是我不想每次编译 cpp 文件都输入长长的 cl 命令,再次查询资料了解到了 makefile 技术,它可以实现自动编译,语法很简单,这就不写了,下面是我的 makefile:

DirectX10+MSVC相关推荐

  1. Windows使用MSVC,命令行编译,链接64位dll,Python调用

    文章目录 代码 编译 链接 Python调用 前一篇博客: Windows下使用Visual Studio自带的MSVC,命令行编译C/C++程序 代码 mylib.h代码如下: #ifndef MY ...

  2. Windows系统下多版本GCC的安装: MinGW Cygwin Msys2 和 VS: MSVC

    文章目录 MinGW 的下载和安装 Cygwin 的下载和安装 Babun的下载和安装 Msys2 的下载和安装 VS MSVC 的下载和安装 MinGW 只包括gcc和g++,不支持离线安装. Mi ...

  3. DirectX10一矩阵代数(二)

    一.矩阵基本概念 在DirectX10中,矩阵是一个非常重要的概念,这里我们主要探讨以下几个方面: 1.矩阵乘法 假设A是一个m*n矩阵,B是一个n*p的矩阵,若C = A* B,则C是一个m*p矩阵 ...

  4. msvc/gcc:中用#pragma指令关闭特定警告(warning)

    在使用一些第三方库或源码的时候,经常会遇到编译时产生warnings情况,这些warning不是我们自己的代码产生的,当然也不好去修改,但每次编译都显示一大堆与自己代码无关的警告也着实看着不爽,更麻烦 ...

  5. MinGW 和 MSVC 下,使用 FILE 类型的一个奇怪的问题

    今天遇到一个奇怪的问题. 开发环境: 1. Eclipse CDT,使用 MinGW 的 gcc 编译器和函数库 2. Visual Studio 2008 问题描述: 在 eclipse cdt 中 ...

  6. QT5.14搭建MSVC(VS2017) x86 以及64位编译器开发环境搭建(GDB配置)

    一.引言 今天想要使用QT+echarts实现炫酷的界面,但是一开始想的很简单,查找资料才发现,我之前一直使用的MinGw编译器无法使用QWebEngine,这个就很头秃,懵逼,今天搞了快一整天配置环 ...

  7. MinGW 与MSVC的区别

    Qt 中有两种方式编译,一种是MinGW ,另一种MSVC. 其中:MSVC是指微软的VC编译器 MingGW是指是Minimalist GNU on Windows的缩写.它是一个可自由使用和自由发 ...

  8. msvc MinGW gcc g++关系

    首先,msvc是windows下针对c.cpp的编译器 gcc,g++一般是GNU下针对linux编译器 MinGW(Minimalist GNUfor Windows)是跨平台的,能在windows ...

  9. QT MSVC 中文报错

    1.QT默认编码格式为UTF8,linux下默认也如此:  (都是utf-8 无bom) 2.minGW 可直接编译 UTF-8 编码,无任何问题. 3.MSVC 2010   MSVC 2013及以 ...

最新文章

  1. java.sql.Connection.close() vs null
  2. Linux下载安装一个源码包
  3. React开发(242):dva概念6effect
  4. 【CodeForces - 574C】Bear and Poker(思维,剪枝,数学)
  5. linux tcp 阻塞时间,TCP的阻塞和重传机制
  6. CPA00 01 02
  7. webloigc12服务启动不了_weblogic启动不能锁定AdminServer.lok的故障处理
  8. 第14讲 转换与比较指令
  9. 封装数据库增删该通用方法
  10. 数学分析教程 第十二章学习感受
  11. c语言的dll反编译,可怕的DLL反编译工具(DLL to C)
  12. RTP协议全解析(H264码流和PS流)
  13. meethigher-与骗子之间的对招
  14. Ubuntu下输入金钱符号时只能输入“₵“无法输入“$“
  15. good man or bad man?
  16. 详解HTTPS通信流程,使用JDK,openssl,XCA进行证书认证详细操作,Spring Boot配置SSL证书实操
  17. namedtuple
  18. npm本地仓库搭建教程
  19. html画布实现小球沿直线下落,js+html5实现的自由落体运动效果代码
  20. 水星UD6S网卡Linux驱动,水星UD6S无线网卡驱动(修复水星UD6S无线网卡连接异常问题)V1.0 免费版...

热门文章

  1. 海报设计如何做好文案超多的海报
  2. 阿里的天蝎计划-迟到了N多年的 SI
  3. python导出数据到excel文件_Python笔记:把数据导出到Excel文件上
  4. JZOJ B组【GDKOI2014】壕壕的寒假作业
  5. excel 去重复值
  6. 走钢索的人---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十七)
  7. c 语言程序编辑,C语言程序编辑学习篇—编程者说之C语言
  8. vscode配置(复制直接用)
  9. emui和鸿蒙哪个好,今天升级了鸿蒙系统,使用起来还真是传说中的顺滑,比之前的Emui好用。...
  10. 12小时制转24小时制