VS2012中使用CEGUI專案釋出到XP平臺的問題

iteye_21202發表於2013-05-14

接著上一篇文章,詳細說說如何把一個帶CEGUI的專案釋出到XP平臺。

這個問題糾纏了我好幾天。這裡把詳細解決思路記下來。有同樣問題的朋友可以少走很多彎路。

核心方法就一句話。“你專案使用的所有外部依賴庫都用/MT編譯。”

1.準備。

首先你要具備如下工具:CEGUI原始碼;FreeType原始碼;Pcre原始碼;CMake工具。我會在下文說明原因。

各個開源庫的版本號,請參考你的CEGUI引用的各自的標頭檔案分別下載。

FreeType開源庫主頁:http://sourceforge.net/projects/freetype/?source=dlp

Pcre開源庫主頁:http://sourceforge.net/projects/pcre/?source=dlp

Pcre原始碼編譯指南:http://tunps.com/cmake-pcrecpp

CMake工具主頁:http://cmake.org/cmake/resources/software.html


2.編譯CEGUI

請參考我的上一篇部落格:http://blog.csdn.net/lsldd/article/details/8821063,編譯CEGUI。注意,每個子專案都要配置好。

編譯完成後,你會發現一大堆Link衝突錯誤和警告,大概如下:

1>freetype.lib(ftbase.obj) : warning LNK4217: locally defined symbol _strrchr imported in function _raccess_make_file_name
1>pcre.lib(pcre_exec.obj) : warning LNK4049: locally defined symbol _memmove imported

1>freetype.lib(smooth.obj) : error LNK2001: unresolved external symbol __imp__longjmp

仔細觀察錯誤,主要是FreeType導致的。原因是CEGUIBase這個工程中引入瞭如下幾個庫:

Winmm.lib,freetype.lib,pcre.lib,zlib.lib

因此我們猜想,這裡的freetype是用/MD編譯的!這就是罪魁禍首!必須自己用/MT編譯原始碼!

Pcre導致很多警告,我這裡以防萬一也自己編譯了;

ZLib也有1,2個警告,但是替換它就坑爹了,因為CEGUI把ZLib拷貝了部分原始碼(unZip部分)到自己工程,又修改了部分原始碼(主要是吧C風格改成C++),因此我沒有替換ZLib,結果表明不影響。


3.編譯依賴庫

同樣參考釋出到XP的標準步驟,分別編譯FreeType原始碼;Pcre原始碼。然後把lib放入CEGUI的dependencies\lib目錄下。

注意。lib目錄下還有2個目錄,由於我們把CEGUI編譯為DLL,所以,請放在dependencies\lib\dynamic目錄下。

然後編譯CEGUI。這裡由於CEGUI已經在上一步編譯過,這一步只是LinK,所以重新Link的時間很短。

Link後仍然會出現一堆庫衝突錯誤。典型的如下:

1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _malloc already defined in LIBCMT.lib(malloc.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _free already defined in LIBCMT.lib(free.obj)

這就是因為工程中同時存在/MT與/MD的依賴,必須砍掉一個。由於我們要釋出到XP必須使用/MT,因此,請忽略掉MSVCRT.lib,方法是:

【工程屬性】-【連結】-【輸入】-【忽略指定依賴項】,輸入MSVCRT.lib

這樣支援釋出到XP的CEGUI就準備好了。


4.配好你的專案

對一個簡單的CEGUI程式而言,需要用到如下DLL:

CEGUIBase.dll,CEGUIOpenGLRenderer.dll,CEGUIExpatParser.dll,CEGUISILLYImageCodec.dll,CEGUIFalagardWRBase.dll ,SILLY.dll

可能還需要部分C執行時庫,比如msvcp100.dll之類。請自行準備,沒有可以去別的系統上COPY或者下載。

隨時注意看CEGUI.Log檔案,看哪個DLL載入失敗。要麼是找不到,要麼是沒有使用/MT編譯。

把CEGUI編譯的相應的Lib連結如你的工程專案。

同時,把【工程屬性】-【連結】-【優化】裡的第一項和第二項優化開關都開啟

同樣用釋出到XP的標準步驟,編譯好你的工程。

現在應該沒有問題了。


相關文章