配置環境的一點教訓(給 CodeBlocks 安裝 OpenGL 有感)
[編輯] [转简体] (简体译文)概要
技術上的事情要排除無關因素的干擾,否則就是事倍功零(稍微誇張一點)。
每一步的嚴謹把控是保證最後成功的重要、極其關鍵因素。
正文
今天有個同學在 CodeBlocks 上配置 OpenGL 一直沒成功,找我幫忙。我去一看,原來是 CodeBlocks 的版本(準確地說是 CB 用的編譯器版本)和 OpenGL 庫的版本不對應。一開始他裝的是 CodeBlocks 20.03 版本,但是載入的 OpenGL 庫文件卻對應 CodeBlocks 17.12 版本,因此雖然 GLUT 項目創建成功,但是編譯報一些奇怪的錯誤。
因爲已經鎖定是這個問題,因此我幫他卸了 CodeBlocks 20.03 之後就立馬重裝了 CodeBlocks 17.12,然後把 OpenGL 庫文件放到對應的目錄下,開始創建項目,起了個和先前一樣的項目名稱。不出意料,項目成功創建,但是編譯卻報錯了。我一看,報錯找不到 gcc 相關的編譯器可執行文件,我當時就奇怪了,這個 CodeBlocks 17.12 難道不帶編譯器的嗎?我沒有給空殼 IDE 單獨裝過編譯器,就算要裝還得臨時去下,成功率極低,而且耗時長久。或者就又得把這個 CB 卸了找個帶編譯器的安裝包再重裝?臨時去下,一樣是耗時難成……我心裏開始有點不安和糾結。忽然我想起來我放置 OpenGL 庫文件的時候還翻動了 MinGW 文件夾,這個 CB 當然是帶編譯器的呀!但爲什麼找不到呢?我立刻想到了肯定是 CB 的編譯器路徑配置有問題。果然如此,CB 裝到了 C:\Program Files (x86),但是編譯器路徑卻配置到了 C:\Program Files,難怪找不到!我懸着的心一下就放下來了,這個好解決。我當即修改編譯器路徑,再次編譯。果然編譯器運作起來了,但是依然報錯,報錯信息更爲古怪,說什麼 “.../main.o not recognized file type” 啥的,完全摸不着頭腦。試來試去還是這樣,這下咋辦?黔驢技窮了,難搞。明明 CB 版本和 OpenGL 也對上了,咋的還不行?我只好又上網搜索,發現可能是編譯器和鏈接器的版本不一致……?懵圈,怎麼可能,這是配套裝的呀,怎麼可能不一致?我試着創建了一個控制檯項目,可以正常編譯運行,排除編譯器和鏈接器版本不一致的問題。那會是什麼情況??
後來又找到一篇文章,說更換編譯平臺的時候他也遇到這個問題,要清除原先的編譯中間文件(.o 等文件)再 rebuild all。我這時猛然意識到,我先後用兩個 CB 版本在同一個項目裏面編譯了,可能舊的 .o 文件被現在新的鏈接器用了,識別不了。於是我刪除原先的 .o 文件,再次編譯,終於成功運行了!我與他以及他同寢室的同學歡送告別,整件事情圓滿落幕。
然而,這件事想來極其後怕。其中暴露出我做事的很大問題,必須提出來鄭重對待:
1. 裝 CodeBlocks 17.12 的時候,纔剛剛卸完 CodeBlocks 20.03 還沒有重啓電腦。很可能正是這個原因,導致了後面 CodeBlocks 17.12 環境變量錯誤沿用了 20.03 版本的環境變量,以至於編譯器路徑默認配置錯誤。好在這個不難解決,我手動重新配置了一下就完事了。但是,如果說這背後還涉及到了其他環境變量,那很可能就不是這麼簡單的事情了。到時候是又非得重卸 CB 不可了,事倍功半矣!我明明知道卸載軟件重裝是要重啓系統的,但是一直以來的習慣就是懶得折騰,直接熱重裝。一時沒有出現什麼問題,然而到這個時候來,就開始顯露端倪了。這次還好是 CB 這種小軟件,要是裝 VS 呢?那就是你裝了大半天發現有奇奇怪怪的問題,最終還是不得不卸了又重裝!根源就在一個小小的偷懶習慣!
2. 我前後兩個版本的 CB 創建項目都用了同一個名字,因此 17.12 創建項目的時候,項目已經存在了,是 20.03 創建的,這就給後面鏈接報錯埋下了禍根。20.03 編譯出來的中間文件沒有被清除,就挨着 17.12 上來編譯,導致鏈接器鏈接了 20.03 編譯出來的 .o 文件,因而版本不兼容,報錯。在不知情的情況下,這個報錯簡直是讓人一頭霧水,然而其實是由於你一開始操作不慎導致的。我在接觸一個並不十分熟悉的環境配置的時候,沒有預先排除一切可能出現的無關變量干擾,兩次沿用同一個項目名稱(testGLUT),導致前後編譯中間文件互相干擾,鏈接報錯。這種鏈接錯誤往往找起來極其耗費時間,然而這一次算我幸運,比較輕鬆地發現了問題並解決了。要是換作其他問題呢?那就哪是一個晚上折騰得明白的了?
因此:
嚴肅認真對待規則。在每個細節上尊重規律,順應規律,就是給自己最大的方便。
條條框框是讓人感到十分麻煩的,但是往往纔是真正幫你的。
爲什麼講柔弱勝剛強?柔弱看起來柔弱,其實是因爲它順着規律走,是真正能在這世上活得好、生存得好的人。剛強表面上剛強,其實就是喜歡暴力、倒行逆施,和人類歷史這麼長時間總結出來的經驗對着幹,要表現自己比天牛,其實最爲愚蠢,也死得最快。
果然陰陽相生,孤陰不立,獨陽不長啊!逞一時方便,到頭來一肚子悔恨!
還是想再說兩句:
這樣不重視每個細節,不對自己的事情極致打磨,不認真按照要求做事的習慣(或是態度),你平時感覺沒啥。到時候你主持工程,碰到這種問題的時候,就不是這麼簡單了——讓你喫不了兜着走!走過人生漫長的道路之後會猛然發現,原來小小的細節,決定了這麼多事情,改寫了多少次命運。
尊重規律,敬畏自然