Qt 是一個很優質的 C++ IDE,在前些日子 Qt Project release Qt 5.1.1 for Windows 64-bit (VS 2012, OpenGL, 522 MB) 的版本,於是重新安裝了這個版本。但是自己卻忘記之前 compile Boost 是 msvc 32-bits 的版本(Boost 的 compile 設定可以參考之前寫的 Building Wt with Visual Studio 2012 on Windows 8 x64 PC 這篇文章),在使用 Boost Getting Started on Windows 的 Regex source code 做測試時,卻出現
Qt 5.1.1 for Windows 64-bit (VS 2012, OpenGL) 這個版本主要是使用 Visual Studio 2012 做為後端的 Compiler,然而安裝 VS 2012 Express for Desktop 可以使用 x64 or x86 的版本,所以安裝完 VS 2012 Express for Desktop 以後,再安裝 Qt 5.1.1 for Windows 64-bit (VS 2012, OpenGL) 就可以使用,並不需要做特別的設定。相同地,使用 Boost 也是一樣,只要不需要特別 link 到 Boost library 的程式,皆可以 compile 成功,並且可以執行。底下省略了安裝 VS 2012 及 Qt 的過程,並且使用之前 Boost 32-bits 的 library 來測試 Boost Getting Started on Windows 的 lambda 程式,整個過程為:
1. 在 Qt 中新增一個 Plain C++ Project:
File > New File or Project > Non-Qt Project > Plain C++ Project
2. 將 main.cpp 的 source code 以 Boost lambda 程式替換:
當每次修改 .pro 時,記得執行 clean all 以及 Run qmake 的動作,清空之前 Qt 系統所產生的暫存檔
error LNK2019: unresolved external symbol
錯誤,參考了 stackoverflow 的這篇文章,才知道用到 32-bits 的 regex Library ,整個修正的過程,紀錄在底下的文章,以後才不至於忘記。Qt 5.1.1 for Windows 64-bit (VS 2012, OpenGL) 這個版本主要是使用 Visual Studio 2012 做為後端的 Compiler,然而安裝 VS 2012 Express for Desktop 可以使用 x64 or x86 的版本,所以安裝完 VS 2012 Express for Desktop 以後,再安裝 Qt 5.1.1 for Windows 64-bit (VS 2012, OpenGL) 就可以使用,並不需要做特別的設定。相同地,使用 Boost 也是一樣,只要不需要特別 link 到 Boost library 的程式,皆可以 compile 成功,並且可以執行。底下省略了安裝 VS 2012 及 Qt 的過程,並且使用之前 Boost 32-bits 的 library 來測試 Boost Getting Started on Windows 的 lambda 程式,整個過程為:
1. 在 Qt 中新增一個 Plain C++ Project:
File > New File or Project > Non-Qt Project > Plain C++ Project
2. 將 main.cpp 的 source code 以 Boost lambda 程式替換:
#include <boost/lambda/lambda.hpp>
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
using namespace boost::lambda;
typedef std::istream_iterator<int> in;
std::for_each(
in(std::cin), in(), std::cout << (_1 * 3) << " " );
}
3. 在 .pro 中指定 Boost include and lib 位置:
# 在 .pro 中 comment 的符號是 #
#INCLUDEPATH += D:/library/boost_154/include/boost-1_54 #LIBS += -LD:/library/boost_154/lib INCLUDEPATH += C:/MinGW/include // 使用 STL 編譯的 Boost Library LIBS += -LC:/MinGW/lib // STL Library 是 for MinGW(.a library) #unix|win32: LIBS += -lboost_regex-vc110-mt-gd-1_54
4. 執行 clean & qmake
Build > clean all; Build > Run qmake
5. 執行 Build and Run:
執行結果如下圖
但是對於需要 link 到 Boost library 的程式,例如 Boost 的 Regex source code,則必須使用 64-bits 的 Boost library 才能夠編譯成功,如果使用 32-bits 的 Boost library 會產生 unsolved external symbol 的錯誤訊息。問題是如何知道你 Boost library 是 32-bits or 64-bits 呢? 在 stackoverflow 的這篇文章中的 Answer 提到,可以使用 VS 2012 中的 dumpbin 程式來檢查,檢查的指令為:
dumpbin /headers libboost_regex-vc110-mt-gd-1_53.lib | findstr machine
於是使用 dumpbin 測試
d:\libraries\lib
Booost 的步驟:
1. 開啟 VS command line 畫面:
Search > 輸入 VS > 點選 VS 2012 cross tools command
2. 測試 Boost library 的版本
d:\ ; cd libraries\lib
dumpbin /headers
libboost_regex-vc110-mt-gd-1_53.lib | findstr machine
3. 結果顯示 x86 而不是 x64 :
確定了 Boost library 是 32-bits 以後,只好再次重新 compile Boost library,compile Boost 的步驟可以參考
Building Wt with Visual Studio 2012 on Windows 8 x64 PC 這篇文章,但是在執行 b2.exe 時要加入
address-model=64 的參數,編譯所產生的 Boost library 才是 for 64-bits 的 library。
再載了最新版的 boost 1.54 版本,在 VS 2012 command line 中執行下列指令:
.\b2 install --prefix=d:\library\boost_154 address-model=64 --build-type=complete
經過幾小時的編譯,將 Boost install 到
d:\library\boost_154 目錄中,可以再使用 dumpbin 程式來測試 compile 出來的 Boost 是不是 64-bits 版,結果是:
確定 Boost library 是 64-bits 後,再次設定 Boost in Qt 的 include, lib 的路徑:
INCLUDEPATH += D:/library/boost_154/include/boost-1_54
LIBS += -LD:/library/boost_154/lib#INCLUDEPATH += D:/libraries/include
#LIBS += -LD:/libraries/lib
#INCLUDEPATH += C:/MinGW/include
#LIBS += -LC:/MinGW/lib
unix|win32: LIBS += -lboost_regex-vc110-mt-gd-1_54
設定完成以後,再次執行 Clean All 及 Run qmake, compile Boost 的 Regex source code 程式就可以編譯成功。
留言
張貼留言