dtAgeiaPhysX是Delta3D 的一个插件,封装了 nVidia 的 PhysX。为了使用它,当然也就要编译Delta3D。不幸的是,编译 Delta3D 已经是一个不小的工作,而且 PhysX 没有64位版本,这样的话,所有的相关软件都得安装或编译32位版本。麻烦程度远超俺滴想象。要说明一下,好象 Delta3D svn 库里的 CMakeLists.txt 文件是有点问题的,我已经修正过了,不过已经不记得改了些什么,总之不是很难,这里就不记了。
总的说,由于64位系统绝大多数32位软件或库都没有有安装的,所以,编译过程经常遇到 incompatible 的库文件之类的错误,这个时候,可以用 rpm -qf 库文件全路径名 来查一下到底是那个库。知道了库名字,就可以用 yum install 库名字.i586 来安装它的32位版本了。安装的时候很容易出现冲突(部分文件与64位版本重复),安装不成功,需要鉴别一下,如果只是 doc 或 include 之类的文件有冲突的话,可以大胆的覆盖,这时候可以到 /var/cache/yum/ 中相应的子目录中去找到下载的 rpm 包,用 rpm -ivh --force rpm文件名 来强制覆盖安装。
苦恼的是,CMake 脚本通常通过 CMAKE_SIZEOF_VOID_P 是否为 8 来判定是否为 64 位系统,这样一来,32位库也会被安装到 lib64 目录里去。我想,要么改 CMakeLists.txt ,直接设置目标目录为 lib,要不,就只好不用 make install 了,自己手动安装。郁闷。没有办法告诉 cmake 说我要编译 32 位版本吗?--改了 CMakeLists.txt,直接把 LIB_POSTFIX 设为空完事。
Delta3D : 一个开源3D仿真/游戏引擎软件,集成了很多相关组件,如 ODE 、 OpenDIS 、 OpenAL 等等,几乎具备了直接制作 3D 仿真系统或游戏的能力。3D方面主要基于 OSG 。
修改 CMakeLists.txt 文件,找到合适的位置,在 CMAKE_CXX_FLAGS 中加入 -m32 参数,强制编译成 32 位版本。如果实在不想找,就在最末尾直接加上: SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32"。
下面几个问题应该是 GCC 版本引起的,看来是新版本的 GCC 中 cstdio 不再作为默认包含的头文件了。
中 snprintf 未定义,修改此文件,加入 #include <cstdio> 就好。
中 va_list 未定义,同上,修改此文件,加入 #include <cstdio> 就好。
中 fpos_t 未定义,处理同上。
不知为什么死活要找 /usr/local/lib64/libgne.a,强行改 CMakeModules/FindGNE.cmake 文件,直接赋值。现在怀疑是 cache 的问题。
OSG : 全称 Open Scene Graph ,基本上是 OpenGL 的 C++ 封装,不过提供了相当多的高级功能,基本上是一个完整的 3D 引擎。
dtAgeiaPhysX : 是 nVidia PhysX 物理引擎(原是 Ageia 公司开发的,此公司已被 nVidia 收购)的封装,针对 Delta3D 集成。
OpenDIS :
它没有用 CMake ,麻烦一些,要加入 -m32 参数,去改 Makefile 吧,不过它的主 Makefile 里什么也没有,倒是另有 4 个 Makefile,一个 DIS.mak 是主要的,另外有两个 example 的 .mak 文件,以及一个单元测试的 .mak 文件,没办法,一个个改吧。
HawkNL :
GNElib :
gdal : 这个家伙其实是个比较通用的库,不应该列在这里,不过它出现的情况比较特殊,还不到连接的时候,就以编译错误的形式出现,和其它库的情况不同。其实也是由于没有 32 位包,它就少了一个 cpl_config-32.h 头文件,装上32位包……在我的系统上它一家伙带上了 17 个“家属”软件--要不是现代 Linux 版本都有自动依赖解析机制,会让人抓狂的。
【编辑推荐】