64位Win7中使用64位庫開發程序遇到的Undefined Reference問題

問題描述

在64位Win7中利用一些64位庫的開發程序有時會出現Undefined Reference(未定義的引用)這類的問題。

比如系統中安裝了64位版本的MySQL,然後按照網上教程一步步配置C/C++的數據庫程序開發環境,到最後編譯鏈接通常都會出現Undefined Reference問題。另一個例子是使用64位的OpenNI2庫來開發Kinect應用程序,通常也會遇到Undefined Reference問題。

出錯原因

Undefined Reference是鏈接階段的錯誤,通常是因爲項目中沒有正確設置庫的xxx.lib文件路徑。但這裏的問題是完全正確地配置了xxx.lib文件的路徑,還是報Undefined Reference錯誤,讓人摸不着頭腦。

其實錯誤的根源還是項目屬性的配置。Windows的Codeblocks、Visual Studio、QT Creator等IDE都有一個Build Target設置項,它通常爲Win32-Debug/Release,這就是問題所在。

一個項目可以有多個Build Target,每個Build Target都是一套不同的項目屬性配置,尤其是項目屬性中關於編譯鏈接部分的配置。當點擊“構建”或者“生成”的時候,IDE就會使用當前活動的Build Target來編譯一個項目。切換活動的Build Target就可以快速地爲項目選擇一套屬性配置。大多數IDE中初始情況下至少都有兩個Build Target:Win32 Debug和Win32 Release。其中Win32是平臺,它說明生成的是32位windows程序。Debug和Release是兩套不同的編譯器配置,Debug生成的程序比較大,包含較多的的調試信息,通常在開發過程中使用,方便調試;Release生成的程序比較小,運行效率比較高,但不適合調試,通常是最終發佈可執行程序的時候用。平時修改項目屬性的時候如果沒注意選擇Build Target的話,通常都是Win32 Debug的那一套項目屬性中做的修改,因爲它是初始情況下項目的活動Build Target。如果IDE允許,還可以新建自己的Build Target,用以生成其它平臺的程序和設置不同的編譯器選項。

所以這裏的問題就很明白了。這裏使用的庫是64位版本的,庫中的lib文件自然也是對應於64位平臺的,但是項目的Build Target由於沒有額外設置,默認爲Win32平臺,64位庫無法與它兼容,這就導致即使項目屬性中已經正確地設置了lib文件的路徑,還是會提示Undefined Reference錯誤。

解決方法

解決的方法很簡單,但前提是所使用的IDE或者編譯器支持64位的Build Target。

VS2013中支持的平臺有Win32、X64和ARM,預定義的配置有Debug和Release,也就是說這裏的Build Target一共至少可以有3x2=6種組合。設置64位平臺的具體步驟如下:


在生成菜單中打開配置管理器:



可以看到初始情況下C++項目的平臺只有Win32:


這裏需要說明一下這個配置管理器的管理邏輯,不熟悉VS的可能看下面的解釋比較吃力,如果趕時間可以暫時不用理會,直接按下一步操作。

最上面一行有“活動解決方案配置”和“活動解決方案平臺”,而下面每一個項目都有一個自己的“配置”和“平臺”,也就是說整個解決方案有Build Target,每個項目也有Build Target。所謂解決方案的Build Target,就是指解決方案中所有項目之間不同Build Target的組合。比如說,項目1設置爲Win32 Debug,項目2也設置爲Win32 Debug,這算是一個解決方案Build Target;項目1設置爲Win32 Release,項目2仍然設置爲Win32 Debug,這又是一個解決方案Build Target。前面計算過VS中一個項目可以有6種Build Target,那麼對於兩個項目的解決方案來說,可以有6x6=36種Build Target。

可以看到最上面第一行解決方案的配置和平臺有“活動”兩個字,意思很明顯,選擇活動的Build Target就是在這裏,而且是爲整個解決方案選擇活動的Build Target。所以在VS中,不能單獨切換某個項目的Build Target,只能切換整個解決方案的Build Target。


在活動解決方案平臺中選擇新建,在彈出的對話框中,從下拉列表選擇平臺爲x64,選擇複製Win32設置,勾選“創建新的項目平臺”:



如果以前已經在項目的Win32平臺設置了庫路徑等屬性,選擇從已有的Win32平臺複製設置可以節省時間,避免爲新的x64平臺重新設置所有的屬性。
勾選“創建新的項目平臺”會自動爲每個項目創建x64平臺,否則x64平臺的解決方案中所有項目各自的平臺還是原來的Win32。


點擊“確定”,設置完畢以後的結果如下:


關閉“配置管理器”,現在生成解決方案或項目,生成的程序將會是64位的,如果庫的lib文件路徑設置正確,不會再有Undefined Reference錯誤了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章