Qt 無法使用 std::atomic

最近要使用另外一條執行緒來擷取影像,然後處理完以後拋回給 UI 執行緒畫出來。想說只有簡單的迴圈控制,使用 atomic 的布林就能夠處理掉這個問題,沒有必要使用 mutex。可是在程式當中引入

#include <atomic>

卻發現編譯不會過。跳出了下面這段訊息

fatal error: 'atomic' file not found

連 header 都錯是哪招?而且這個問題在 .pro 當中(我在使用 Qt)加入了

QMAKE_CXXFLAGS += -std=c++11

指定使用 C++11 標準⋯⋯也沒用。

後來重新爬了網路的文以後,在使用 Xcode 的那一派人身上也有出現過相似的問題,因此初步猜測是 libc++ 沒有被正確的指派到(或用錯個?)在 .pro 當中再補上

macx {
    QMAKE_CXXFLAGS += -stdlib=libc++
    QMAKE_LFLAGS += -stdlib=libc++
}

居然這樣就正常編譯過了⋯⋯

總結一下,共做了三個修改才正確的讓系統找到 atomic 的標頭檔:

  1. 編譯時多加 -std=c++11,讓編譯器以 C++11 的標準來編譯。
  2. 編譯時再加 -stdlib=libc++,強制加入 libc++ 函式庫,讓系統搜得到 atomic。
  3. 在連結的時候,同時也要把 libc++ 連上來,所以還在 LFLAGS 加入 -stdlib=libc++

至於塞在 macx 當中,是為了指定只有 OSX 的平台編譯時需要多這一行,怕在意外間讓其他平台編譯的時候多了不需要的旗標們。不過這還有待驗證 @___@