首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

了解Cocos2D-X引擎的达人请答疑:cocos2d-x是如何链接上系统的OpenGL库的

2012-03-22 
了解Cocos2D-X引擎的达人请答疑:cocos2d-x是怎么链接上系统的OpenGL库的?这个问题恳请做过cocos2d-x并对其

了解Cocos2D-X引擎的达人请答疑:cocos2d-x是怎么链接上系统的OpenGL库的?
这个问题恳请做过cocos2d-x并对其编译过程有一定了解的朋友回答,因为不了解cocos2d-x框架是不可能回答出的。纯粹靠猜测的答案就算了。
  大家知道cocos2d-x基于OpenGL,那么当我生成了一个可以正确编译执行的cocos2d-x for Win32的工程,它是从哪里找到Windows系统的OpenGL库去调用的呢?根据我的理解,既然生成的程序是在Windows下运行,必定像通常在Windows下做OpenGL开发一样,cocos2d-x引擎自身的源码里会include系统自带的gl.h或glu.h头文件,这样引擎中调用OpenGL原语操作的地方才能让编译器知道去链接系统自带的OpenGL库。然而实际观察的结果似乎没那么简单:

  我通过在VS2010中不断地找函数声明的办法去追踪cocos2d-x源码里对OpenGL直接操作的那些函数最终来自哪里,比如在CCDrawingPrimitives.cpp(在/c2dx/cocos2dx/里,这里假定/c2dx是cocos2d-x被安装的目录位置)里用到的各种以gl开头的函数,明显都是OpenGL的API。但它所包含的头文件只有如下几个:

#include "CCDrawingPrimitives.h" (而CCDrawingPrimitives.h中又只#include了"CCGeometry.h",与OPENGL库无关)
#include "ccTypes.h"
#include "ccMacros.h"
#include "CCGL.h"
#include "CCDirector.h"
#include <string.h>
#include <cmath>

看来看去只有CCGL.h有关系,于是再在/c2dx/cocos2dx/include/里找到了CCGL.h, 它包含了"platform/CCGL.h", 
而/c2dx/cocos2dx/platform/CCGL.h又包含如下头文件:
#include <GLES/gl.h>
#include <GLES/glext.h>
这两个头文件存在于\c2dx\cocos2dx\platform\third_party\win32\OGLES\GLES文件夹,
glext.h中没什么值得注意的内容,只是一些OpenGL扩展的API声明; gl.h里又包含了<GLES/glplatform.h>

最终,glplatform.h里包含了<KHR/khrplatform.h>,它的内容除了一些宏定义、typedef以外,就只有开头这一段我看不懂的,可能有点关系:
#if (defined(_WIN32) || defined(__VC32__)) && !defined(__SCITECH_SNAP__) && !defined(__WINSCW__)
# if defined (_DLL_EXPORTS)
# define KHRONOS_APICALL __declspec(dllexport)
# else
# define KHRONOS_APICALL __declspec(dllimport)
# endif
#elif defined (__SYMBIAN32__)
# if defined (__GCC32__)
# define KHRONOS_APICALL __declspec(dllexport)
# else
# define KHRONOS_APICALL IMPORT_C
# endif
#else
# define KHRONOS_APICALL
#endif

到此为止就查到底了。所以令我非常困惑的是,为什么cocos2d-x源代码中似乎从来没有include系统中的gl.h或glu.h,而是一直在自己的头文件里打转,但却确确实实能调用到OpenGL的API呢?


[解决办法]
看看有没有pragma之类的东西
[解决办法]
头文件本来就是可以不需要的
不过lib必须包含,可能它把opengl的lib合并进去了
[解决办法]
android 下面opengl的库在ndk目录下,例如我的~/android-ndk-r6/platforms/android-9/arch-arm/usr/lib, 里面就有libGLESv1_CM.so, 然后使用ndk编译时会自动搜索你配置的ndk以及相关的target 对应的目录。
[解决办法]
win32用的是 libgles_cm.dll
看 libgles_cm.dll的导出符号

热点排行