在64位Linux下編譯dtAgeiaPhysX
dtAgeiaPhysX是Delta3D 的一個(gè)插件,封裝了 nVidia 的 PhysX。為了使用它,當(dāng)然也就要編譯Delta3D。不幸的是,編譯 Delta3D 已經(jīng)是一個(gè)不小的工作,而且 PhysX 沒(méi)有64位版本,這樣的話,所有的相關(guān)軟件都得安裝或編譯32位版本。麻煩程度遠(yuǎn)超俺滴想象。要說(shuō)明一下,好象 Delta3D svn 庫(kù)里的 CMakeLists.txt 文件是有點(diǎn)問(wèn)題的,我已經(jīng)修正過(guò)了,不過(guò)已經(jīng)不記得改了些什么,總之不是很難,這里就不記了。
總的說(shuō),由于64位系統(tǒng)絕大多數(shù)32位軟件或庫(kù)都沒(méi)有有安裝的,所以,編譯過(guò)程經(jīng)常遇到 incompatible 的庫(kù)文件之類的錯(cuò)誤,這個(gè)時(shí)候,可以用 rpm -qf 庫(kù)文件全路徑名 來(lái)查一下到底是那個(gè)庫(kù)。知道了庫(kù)名字,就可以用 yum install 庫(kù)名字.i586 來(lái)安裝它的32位版本了。安裝的時(shí)候很容易出現(xiàn)沖突(部分文件與64位版本重復(fù)),安裝不成功,需要鑒別一下,如果只是 doc 或 include 之類的文件有沖突的話,可以大膽的覆蓋,這時(shí)候可以到 /var/cache/yum/ 中相應(yīng)的子目錄中去找到下載的 rpm 包,用 rpm -ivh --force rpm文件名 來(lái)強(qiáng)制覆蓋安裝。
苦惱的是,CMake 腳本通常通過(guò) CMAKE_SIZEOF_VOID_P 是否為 8 來(lái)判定是否為 64 位系統(tǒng),這樣一來(lái),32位庫(kù)也會(huì)被安裝到 lib64 目錄里去。我想,要么改 CMakeLists.txt ,直接設(shè)置目標(biāo)目錄為 lib,要不,就只好不用 make install 了,自己手動(dòng)安裝。郁悶。沒(méi)有辦法告訴 cmake 說(shuō)我要編譯 32 位版本嗎?--改了 CMakeLists.txt,直接把 LIB_POSTFIX 設(shè)為空完事。
Delta3D : 一個(gè)開源3D仿真/游戲引擎軟件,集成了很多相關(guān)組件,如 ODE 、 OpenDIS 、 OpenAL 等等,幾乎具備了直接制作 3D 仿真系統(tǒng)或游戲的能力。3D方面主要基于 OSG 。
修改 CMakeLists.txt 文件,找到合適的位置,在 CMAKE_CXX_FLAGS 中加入 -m32 參數(shù),強(qiáng)制編譯成 32 位版本。如果實(shí)在不想找,就在最末尾直接加上: SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32"。
下面幾個(gè)問(wèn)題應(yīng)該是 GCC 版本引起的,看來(lái)是新版本的 GCC 中 cstdio 不再作為默認(rèn)包含的頭文件了。
中 snprintf 未定義,修改此文件,加入 #include <cstdio> 就好。
中 va_list 未定義,同上,修改此文件,加入 #include <cstdio> 就好。
中 fpos_t 未定義,處理同上。
不知為什么死活要找 /usr/local/lib64/libgne.a,強(qiáng)行改 CMakeModules/FindGNE.cmake 文件,直接賦值?,F(xiàn)在懷疑是 cache 的問(wèn)題。
OSG : 全稱 Open Scene Graph ,基本上是 OpenGL 的 C++ 封裝,不過(guò)提供了相當(dāng)多的高級(jí)功能,基本上是一個(gè)完整的 3D 引擎。
dtAgeiaPhysX : 是 nVidia PhysX 物理引擎(原是 Ageia 公司開發(fā)的,此公司已被 nVidia 收購(gòu))的封裝,針對(duì) Delta3D 集成。
OpenDIS :
它沒(méi)有用 CMake ,麻煩一些,要加入 -m32 參數(shù),去改 Makefile 吧,不過(guò)它的主 Makefile 里什么也沒(méi)有,倒是另有 4 個(gè) Makefile,一個(gè) DIS.mak 是主要的,另外有兩個(gè) example 的 .mak 文件,以及一個(gè)單元測(cè)試的 .mak 文件,沒(méi)辦法,一個(gè)個(gè)改吧。
HawkNL :
GNElib :
gdal : 這個(gè)家伙其實(shí)是個(gè)比較通用的庫(kù),不應(yīng)該列在這里,不過(guò)它出現(xiàn)的情況比較特殊,還不到連接的時(shí)候,就以編譯錯(cuò)誤的形式出現(xiàn),和其它庫(kù)的情況不同。其實(shí)也是由于沒(méi)有 32 位包,它就少了一個(gè) cpl_config-32.h 頭文件,裝上32位包……在我的系統(tǒng)上它一家伙帶上了 17 個(gè)“家屬”軟件--要不是現(xiàn)代 Linux 版本都有自動(dòng)依賴解析機(jī)制,會(huì)讓人抓狂的。
【編輯推薦】