您的位置:首页 > 编程语言

编译《OpenGL ES 3.0 编程指南》书中代码

2016-12-02 00:00 519 查看
之前写过一篇 blog 刚开始编译时,没有编译过去。因而转向了 mingw32 。最近想起来就想再编译一次。于是写篇记录一下。

按照书中要求先下载 AdrenoSDK ,我用的是 adrenosdk_5_0.zip 这个版本。下载完成后解压到指定目录。

在 Windows 平台使用 cmake 生成 solution 。

步骤很简单。解压后 adreno 含有编译好的 .lib 和 .dll 文件。我懒得再编译 adreno 了,就直接使用了自带的。假设 sdk 被解压在 sdk 目录。

在 sdk\Development\Lib 存放相关的 .lib 文件有 x64 和 win32 平台。

sdk\AdrenoSDK\Bin 和 sdk\AdrenoSDK\Bin_d 存放了相关的 dll 文件。

于是乎,就可以生成 solution 文件了。先 clone 下 opengles3-book 代码,然后在目录中创建一个 build 目录,然后在 build 目录中执行下面直接给命令。

cmake .. -DEGL_LIBRARY:PATH=E:\sdk\adreno_sdk\AdrenoSDK\Lib64\libEGL.lib -DOPENGLES3_LIBRARY:PATH=E:\sdk\adreno_sdk\AdrenoSDK\Lib64\libGLESv2.lib -G "Visual Studio 11 2012 Win64"

我用的是在 64 位 Windows7 上用的 vs2012 。所以生成的 vs2012 solution ,并且生成 64 位程序。EGL_LIBRARY 和 OPENGLES3_LIBRARY 这两个 CMakeLists.txt 中定义的变量需要我们手动设置。它们表示文件路径名,分别表示 egl 和 opengles 库文件。

下面我想说一下中间我碰见的问题。
下载下来的 adreno 虽然有 32 位的 .lib 文件,但是没有 .dll 文件,所以放弃使用 32 位版本。刚好 64 位的 .lib 文件和 .dll 文件都有,所以采用 64 位版本。也是因为此,我们在使用 cmake 时需要指定
Win64
来生成 64 位的工程。
最好还是别使用 ardreno 中 debug 版本的库文件,自带编译好的库文件用的 vs 版本可能和你的电脑上安装的 vs 版本不一致,这样允许时就会提示缺少什么什么 dll 文件,很讨厌的。我先是用的 debug 版本,运行不了后就换成了非 debug 版本。

下面说说 win32 和 win64 。简单点就是在 win32 上生成 32 位程序,win64 上生成 64 位程序。但是可以交叉编译,于是在 win32 可以生成 64 位程序,在 win64 也可以生成 32 位程序。以 vs2012 为例,vs2012 提供了好几个命令行工具(这里有人问答,我这里直接搬照)。

问:
Developer Command Prompt for VS2012:
1) Developer Command Prompt for VS2012
2) VS2012 ARM Cross Tool Command Prompt
3) VS2012 x64 Cross Tool Command Prompt
4) VS2012 x86 Native Tool Command Prompt
5) VS2012 x64 Native Tool Command Prompt
答:
2-5 are self explanatory - if you run cl.exe blah.cpp then the version of cl [and associated tools]invoked will be different for each window:
2) compiler that generates arm code
3) 32 bit compiler that generates 64 bit code
4) 32 bit compiler that generates 32 bit code
5) 64 bit compiler that generates 64 bit code
If you don't compile from the command line just use number 1 and that will set up non platform specific tools.

这个人回答的很好了,我就不解释了。具体查看某个命令行时发现它们本质是同一个 .bat 脚本,只是传入的参数不同。.bat 脚本路径(这里是我的 vs 路径)如下。

%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"" x86_amd64

打开 vcvarsall.bat 文件,具体查看如下。

if "%1" == "" goto x86
if not "%2" == "" goto usage

if /i %1 == x86       goto x86
if /i %1 == amd64     goto amd64
if /i %1 == x64       goto amd64
if /i %1 == arm       goto arm
if /i %1 == x86_arm   goto x86_arm
if /i %1 == x86_amd64 goto x86_amd64
goto usage

:x86
if not exist "%~dp0bin\vcvars32.bat" goto missing
call "%~dp0bin\vcvars32.bat"
goto :SetVisualStudioVersion

:amd64
if not exist "%~dp0bin\amd64\vcvars64.bat" goto missing
call "%~dp0bin\amd64\vcvars64.bat"
goto :SetVisualStudioVersion
...

其实就是根据输入的参数不同具体打开不同路径下的 .bat 文件,而不同的路径下你点进去就会发现各有 cl.exe 和 link.exe 。原来 vs 给了我们不同平台的编译器和链接器供我们使用,进而生成不同平台的可执行文件。

再来说一下 link.exe 提供了 /MACHINE 选项,可以指定 X86 和 X64 等等,用来生成不同平台的可执行文件,具体查看这里。msdn 文档中也说明了 GUI 中如何设置这个选项。文档中也说了一般是不需要我们设置的。当前在 vs 中的属性界面上看见此选项时,就知道工程是什么平台的工程了。

说了这么多就来练手呗。

#include <stdio.h>

int
main(int argc, char **argv) {
char *p = NULL;
printf("hello, the pointer size:%d\n", sizeof(p));
return 0;
}


在上述说的 vs 提供的不同平台的命令行工具中编译程序并执行查看指针的大小,来看可执行文件是 32 位还是 64 位。编译命令如下。

cl test.c /link /OUT:t.exe /SUBSYSTEM:CONSOLE


在 mingw32 中用 32 位 gcc 和在 cygwin64 中用 64 位 gcc 编译程序并执行。这个很常见啦,
gcc -o t test.c
。来看输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Visual Studio OpenGL ES