posts - 4,  comments - 0,  trackbacks - 0
  2011年10月24日

被逼得昏头的码农们翻了不少网页,本着别人(包括gdal官方网、google查来的)的“红宝书”,一阵鼓捣,那些淘来的,本也是不求甚解,做不得准,一堆尝试,虽然也是成功了,却脱不开舍近求远。按乔布斯的说法,简洁需要更多的劳动,把所得放上来,给忙碌的同道们一点参考,但求省点时间。

对于gdal-1.7.3以后的版本,VS2005编译其实很简单。

在GDAL目录下的nmake.opt文件中,找到大概第一百行多点的,原来是:
#WIN64=YES
修改为:
WIN64=YES
即如下:
# Uncomment the following if you are building for 64-bit windows
# (x64). You'll need to have PATH, INCLUDE and LIB set up for 64-bit
# compiles.
WIN64=YES

在新建x64平台时,必须选择复制Win32设置,如果你直接编译不行,可能需要安装vcredist_x86.exe(我安装了,但不知这是否是决定因素)。

当然,gdal-1.7.1编译需修改源代码中的错误,做点额外的步骤。
源文件“\gdal-1.7.1\frmts\leveller\levellerdataset.cpp”的第171行的内容如下:
{ "?, kPI / 180.0, UNITLABEL_DEGREE },
在?号后面加上双引号",改成如下形式:
{ "?", kPI / 180.0, UNITLABEL_DEGREE },

默认的情况下,GDAL将会安装到"C:\warmerda\bld"文件夹内,可以改成自己习惯的目录,如可把GDAL_HOME修改成如下内容:
GDAL_HOME = "D:\gdal-runtime"

makegdal80.sln编译后:配置属性->NMake->常规->"生成"命令行,修改
原来是:cd $(ProjectDir) && nmake -f makefile.vc MSVC_VER=1400 DEBUG=1
修改为:cd $(ProjectDir) && nmake -f makefile.vc MSVC_VER=1400 DEBUG=1 devinstall

确定之后,编译。之后会在gdal-runtime里面生成include、lib、bin等文件夹。

于其它更老的版本,我也是匆忙之间,懒得再去尝试了,欢迎其它人补充。


参考链接:
ms-help://MS.MSDNQTR.v80.chs/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_vccore/html/cb99f72b-8c74-48f4-846a-8921b37b97e9.htm
如何:针对 64 位平台配置 Visual C++ 项目
 
posted @ 2011-10-24 17:07 龙湖 阅读(774) | 评论 (0)编辑 收藏
  2010年9月30日

   引擎从何处开始,到何处结束。引擎当然从入口点开始,对c/c++程序员而言,控制台程序始于main(),win32程序始于WinMain()。一个显而易见的事实,它从朴素的程序框架开始,而不是各种夺目的功能和特效。
   假如我们同时需要控制台和win32窗口呢?需要它的可能理由:
   ①一个方便调试的控制台,在发布时,随时可以把它屏蔽。
   ②从命令行执行不同的模式
   ③尽可能简单的程序入口点

   一种解决办法比较笨拙,使用预定义,如OGRE:
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
#else
int main(int argc, char **argv)
#endif

   另一种解决办法是在main()和WinMain()中调用同一个函数run(),且通过GetModuleHandle(NULL)获取CreateWindowEx前registerWindowClass需要的HInstance。
   windowClass.hInstance   = winState.appInstance;
   用全局的winState.appWindow保存创建的窗口句柄。大致代码如下(来源于Torque引擎),不再赘述。

struct Win32PlatState
{
     HINSTANCE hinstOpenGL;
     HINSTANCE hinstGLU;
     HWND appWindow;
     HDC appDC;
     HINSTANCE appInstance;
     HGLRC hGLRC;
}; 

Win32PlatState winState;

//--------------------------------------
static int run(int argc, const char **argv)
{
      // 伪码
     int ret = mst->main(argc, argv);
     Platform::createWindow();
     Platform::process();

     return ret;
}

//--------------------------------------
int main(int argc, const char **argv)
{
     winState.appInstance = GetModuleHandle(NULL);
     return run(argc, argv);
}

//--------------------------------------
int PASCAL WinMain(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPSTR    lpCmdLine,
                      int       nCmdShow)
{
     std::vector<char *> argv;
     char moduleName[256];
     GetModuleFileNameA(NULL, moduleName, sizeof(moduleName));
     argv.push_back(moduleName);

     for (const char* word,*ptr = lpCmdLine; *ptr; )
     {
         // Eat white space
         for (; isspace(*ptr) && *ptr; ptr++)
              ;

         // Pick out the next word
         for (word = ptr; !isspace(*ptr) && *ptr; ptr++)
              ;

         // Add the word to the argument list.
         if (*word)
         {
              int len = ptr - word;
              char *arg = (char *) malloc(len + 1);
              strncpy(arg, word, len);
              arg[len] = 0;
              argv.push_back(arg);
         }
     }

     winState.appInstance = hInstance;
     int retVal = run(argv.size(), (const char **) argv.front());
     for(unsigned int j = 1; j < argv.size(); j++)
         free(argv[j]);

     return retVal;
}

参考链接:
   Getting the HWND and HINSTANCE of the Console Window
   http://bobobobo.wordpress.com/2008/02/03/getting-the-hwnd-and-hinstance-of-the-console-window

posted @ 2010-09-30 14:23 龙湖 阅读(346) | 评论 (0)编辑 收藏

   从根源开始,渐及枝叶,发掘微末却核心的引擎技巧,但有所见,心下自喜,故名“微核”。至于mst来历,天知地知,先且藏拙。
   在下面的blog中,本人将从实践中总结点滴的技巧,与引擎原创爱好者交流,不吝见笑于大方。是为序。

posted @ 2010-09-30 13:54 龙湖 阅读(262) | 评论 (0)编辑 收藏
  2010年9月16日

   方今之世,引擎不下百种,皆为舶来品,国内鲜见,就开源的,亦相差不止几里地。外有黎纽斯,内有裘伯君,龙湖本民工,虽系菜鸟,不甘落后,翻出楚兰陵令鼓气张目。欲以愚公和毛公之精神,积硅步而至千里,积小流而成江海。
   荀卿曰:
   积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。是故无冥冥之志者,无昭昭之明;无惛惛之事者,无赫赫之功。行衢道者不至,事两君者不容。目不能两视而明,耳不能两听而聪。螣蛇无足而飞,鼫鼠五技而穷。《诗》曰:“尸鸠在桑,其子七兮。淑人君子,其仪一兮。其仪一兮,心如结兮!”故君子结于一也。
   又曰:
   夫骥一日而千里,驽马十驾则亦及之矣。将以穷无穷,逐无极与?其折骨绝筋,终身不可以相及也。将有所止之,则千里虽远,亦或迟或速、或先或后,胡为乎其不可以相及也?不识步道者,将以穷无穷,逐无极与?意亦有所止之与? 夫坚白、同异、有厚无厚之察,非不察也,然而君子不辩,止之也;倚魁之行,非不难也,然而君子不行,止之也。故学曰:“迟彼止而待我,我行而就之,则亦或迟或速,或先或后,胡为乎其不可以同至也?”故跬步而不休,跛鳖千里;累土而不辍,丘山崇成;厌其源,开其渎,江河可竭;一进一退,一左一右,六骥不致。彼人之才性之相县也,岂若跛鳖之与六骥足哉?然而跛鳖致之,六骥不致,是无他故焉,或为之,或不为尔。
   道虽迩,不行不至;事虽小,不为不成。

posted @ 2010-09-16 17:35 龙湖 阅读(238) | 评论 (0)编辑 收藏
仅列出标题