兩年半前曾經搞過一次,但沒記錄。我還清晰地記得,自己成功地編譯安裝Qt,是我進入UNIX世界的契機。
當時的OS是雪豹,跟的一些文件也不曉得跑哪兒去了。
----
OS: 10.8.1 Mountain Lion
Qt 4.8.1 (抓官網dmg下來裝)
MySQL 5.5.27 (抓官網dmg下來裝)
故事是這樣的:我在寫一支Qt程式,需要資料庫。一開始抱著玩玩新玩具的心情選了SQLite,很順利的連接運作彷彿一切都是這麼自然。
然後得知該應用會需要處理非常大量的資料,我不確定SQLite有沒有辦法處理,且未來有可能需要做成multi-client存取一個資料庫的情況,我決定換成MySQL。
這就是苦難的開始。
Qt 需要個別DBMS的「driver」,而這東西並不隨Qt一併散佈,需要抓Qt source code 下來編譯(只需編譯driver的那一小部分即可)。
抓下source tar ball了,README告訴你:要編譯MySQL driver,請提供MySQL header。
這意味XAMPP武功全廢,請在系統上真的安裝MySQL。
抓下來安裝好,你有了全套MySQL與該有的header與library。
然後照著Qt官網寫的步驟把driver編出來也安裝好了。
但為什麼還是不能動!!!!
App在console上噴的錯誤訊息從來就沒有變過:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC3 QODBC QPSQL7 QPSQL
("QSQLITE", "QODBC3", "QODBC", "QPSQL7", "QPSQL")
("/Users/mac/QtSDK/Desktop/Qt/4.8.1/gcc/plugins", "/Users/mac/learnQt/ManageSystem-build-desktop-Desktop_Qt_4_8_1_for_GCC__Qt_SDK__Debug/ManageSystem.app/Contents/MacOS")
QSqlQuery::exec: database not open
這太令人無力了。
怎麼Google都無解的狀況讓人沮喪,我整個下午都在處理這個鳥問題!
最後終於google到一個討論串解決了我的問題。
解法是3行shell script,先export兩個環境變數,接著一個 install_name_tool指令。
我目前仍然不曉得原理為何,看指令令人疑惑。
man page上寫 install_name_tool -change 接受兩個參數, old和new。
但上述討論串給了3個參數。我不確定最後一個是不是默默忽略了。
我猜想,這個指令的功能是把 libmysqlclient.18.dylib 這個檔案重新指向正確的位置、亦即mysql在系統上的安裝位置。
不曉得以後發佈到Window上這樣的過程要不要再來一次(抖)
噢對了,到這裡後,無論是系統的MySQL或XAMPP的MySQL都連得上了。
不過XAMPP的需要額外一行:
db.setConnectOptions("UNIX_SOCKET=/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock");