mingw編譯問題小計

2021-09-23 23:06:55 字數 1462 閱讀 999

今天終於把端午寫的**在windows上(mingw)編譯過了。過程還是比較艱辛的,這裡記錄下(之前boost庫的編譯,可以參考前面的部落格):

1、cmake查詢系統上的boost庫,之前直接失敗,原因是findboost這個檔案只支援到最高1.46.0版本,自己編譯安裝的boost版本是1.46.1。修改了這個檔案支援的boost版本之後,能夠找到目錄了,但是boost thread和boost system都沒法找到。解決方法是在cmake檔案中新增:

if(win32)

set(boost_use_static_libs on)

set(boost_no_system_paths on)

set(boost_use_static_runtime on)

endif(win32)

之後,讓boost去強制尋找靜態庫(之前編譯boost只編譯了靜態庫)

2、boost asio庫在windows中鏈結的時候,需要指定鏈結win32 socket相關的庫。mingw沒有vs這樣能夠根據靜態鏈結庫自動去鏈結它依賴的庫,所以在最終鏈結成可執行程式的時候,會報undefined reference。解決方法在cmake中新增:

這樣當編譯環境在windows中時,會自動鏈結mswsock和ws2_32兩個庫。

3、boost thread庫的靜態鏈結。boost thread庫在最後鏈結的時候,也會報有些符號找不到,差了半天原因,是因為boost在試圖鏈結thread庫的動態鏈結庫。因為不想讓這個程式在其他windows機器上跑要複製dll,解決方法前面已經有了,就是新增add_definitions(-dboost_thread_use_lib)這個巨集定義,強制boost尋找靜態鏈結庫。

4、靜態鏈結mingw的gcc和stdc++庫。之前編譯完的程式,放到其他機器上還是會報有libgcc相關的動態鏈結庫找不到,因為mingw預設是將內建的gcc和c++庫做動態鏈結的。要修改這個,需要在編譯的時候給編譯器傳遞-static-libgcc -static-libstdc++這兩個引數,在cmake中可以這樣修改cmakelists.txt檔案:

if(win32)

set(cmake_cxx_flags 「-static-libgcc -static-libstdc++」)

endif(win32)

Windows配置Mingw編譯

這一年打code用的基本上都是ubuntu的vim,這次突然轉到windows,瞬間不想用dev cpp,於是想自己下個編譯器,這裡介紹如何安裝並配置mingw 然後在檔案管理器裡,計算機 屬性 高階系統設定 環境變數,然後再系統變數裡找到path,編輯,再最後加上 假如dev cpp裝在c盤de ...

使用MinGW編譯Qt Creator

qt creator中編譯專案使用的是mingw g 編譯器,而qt提供的qt creator本身是由msvc2013編譯的,二者的build key不同,故而qt creator中編譯的外掛程式無法在qt creator中使用 這個搭配真的是滑天下之大稽呀 為了在qt creator中使用自定義外...

MinGW編譯dll並引用

記得某位神仙曾經說過 乙個專案不使用dll簡直是一場災難。滑稽 這篇文章以a b a b為範例,來介紹如何在mingw下編譯dll並引用。include using namespace std define export declspec dllexport extern c int a b int...