1. 程式人生 > 其它 >在Windows平臺上使用GCC編譯C程式

在Windows平臺上使用GCC編譯C程式

        最近用 C 語言寫了一個小程式,在設計時希望該程式在 Windows、Linux平臺上都能夠執行,所以使用巨集來區分在不同作業系統下執行的語句。比如這個程式需要載入動態連結庫,在包含標頭檔案時,寫法如下:
#if defined(_WIN32) || defined(_WIN64)
  #include <windows.h>
#else
  #include <dlfcn.h>  /* unix 或 linux 下包含與動態庫載入、解除安裝有關函式的標頭檔案名是 dlfcn.h */
#endif

        載入動態連結庫時,處理方法如下:

#if
defined(_WIN32) || defined(_WIN64) HINSTANCE dll_handle_for_win; /* 當作業系統為 windows 型別時,使用函式 LoadLibrary() 載入動態連結庫 */ #else void *dll_handle_for_unix_or_linux; char *error_statement; /* 當作業系統為 unix 或 linux 型別時,使用函式 dlopen() 載入動態連結庫 */ #endif int error_code; char dll_file_name[256]; /* dll_file_name 是要載入的動態連結庫檔名
*/ /********************************* 注意:這裡省略了部分內容 **********************************/ /**************************************/ // Load dynamic library #if defined(_WIN32) || defined(_WIN64) if ( !(dll_handle_for_win = LoadLibrary(dll_file_name)) ) { #ifdef _DEBUG printf("load dynamic link library \'%s\' failed at %s, line %d!\n
", dll_file_name, __FILE__, __LINE__); error_code = GetLastError(); printf("LoadLibrary() function returned error code: 0x%x\n", error_code); #endif return (-1); } /**************************************/ #else dlerror(); if ( !(dll_handle_for_unix_or_linux = dlopen(dll_file_name, RTLD_LAZY)) ) { error_statement = dlerror(); #ifdef _DEBUG printf("load dynamic link library \'%s\' failed at %s, line %d!\n", dll_file_name, __FILE__, __LINE__); printf("Error statement: %s\n", error_statement); #endif return (-1); } #endif

        釋放動態連結庫時,處理方法如下:

#if defined(_WIN32) || defined(_WIN64)
  FreeLibrary(dll_handle_for_win);
#else
  dlclose(dll_handle_for_unix_or_linux);
#endif

 

        在 64 位 Win7 下,用 Visual Studio 2010 編譯、連結,能夠生成可執行程式,程式能正常執行。接下來想知道在 Linux 下該程式能否編譯,希望在 Windows 平臺上先排除一下像拼寫一類的小錯誤,可是手頭暫時沒有安裝Linux 的計算機,這樣就需要在 Windows 平臺上用 GCC 編譯一下這個程式,我的做法如下:

1. 安裝 MinGW;在 MinGW 的官網( http://mingw.org/ )上找到安裝檔案。
    下載連結為:
https://nchc.dl.sourceforge.net/project/mingw/Installer/mingw-get-setup.exe
    注意:這個是 32 位的 MinGW,如果需要 64 位的 MinGW,
    下載網頁是:
MinGW-w64 - for 32 and 64 bit Windows download | SourceForge.net
    執行程式 mingw-get-setup.exe,安裝時會看到是否同時安裝圖形使用者介面支援( also install support for the graphical user interface )的提示,由於用不到,就取消了對這一項的勾選。安裝時將 MinGW 安裝到了預設目錄 C:\MinGW 下。

2. 安裝GCC;按Windows組合鍵 Win + R,輸入命令 cmd,啟動命令提示符視窗。進入目錄 C:\MinGW\bin\ ,執行命令:mingw-get install gcc
    這樣就開始從網路上下載 GCC 相關的檔案,安裝完成後,
    執行命令:gcc --version ,將會看到 GCC 的版本號。如果想獲取更多資訊,可以執行命令:gcc -v

 

3. 修改環境變數;“開始”按鈕 -> 計算機 -> 選單中的“系統屬性” -> 高階系統設定,修改環境變數,在原有的 Path 後面新增以下內容:
    ;C:\MinGW\bin\

 

     修改完成後重啟計算機。重啟後,就可以在命令提示符視窗中,在任意路徑下執行 gcc.exe 程式了。

4. 編譯 C 程式。由於當前階段只想編譯程式,不需要連結。進入命令提示符視窗,到程式所在目錄下,執行gcc的命令

    格式如下:gcc -c 原始碼檔名.c -I 標頭檔案所在路徑
    比如可以是:gcc -c test.c -I C:\testcode\include
    結果顯示了一大堆錯誤和警告。仔細一看,好像編譯報錯的程式語句都處於 _WIN32 或 _WIN64 巨集定義中包含的部分。我們此時的目的並不是要用 GCC 生成 Windows 下的可執行程式,而是想讓 GCC 編譯一下程式中能夠在 Linux 平臺上執行的那部分語句,檢查那部分語句中是否存在語法等錯誤,但是現在 GCC 編譯的還是在 Windows 平臺上能執行的語句。為什麼會這樣?需要檢視一下 GCC 編譯時預設已定義了哪些巨集。在網上查到檢視 GCC 編譯時預設巨集的命令是:
gcc -posix -E -dM - </dev/null
    可是該命令在 Windows 的命令提示符視窗中無法執行。這該怎麼辦呢?忽然想到這臺計算機上安裝過從
Git for Windows 上下載的 git for windows。該程式自帶了一個 Git Bash,如下圖:


    到“開始”選單中,啟動 Git Bash,然後輸入命令:gcc -posix -E -dM - </dev/null
    這下可以成功執行了,顯示出當前 GCC 中定義的巨集列表,如下圖:

    果然使用 mingw-get 安裝的 gcc 中,已經預設定義了 _WIN32 巨集。在編譯 C 程式時,想取消對 _WIN32 及 _WIN64 巨集的定義,可以使用下面的命令:
gcc -c test.c -I C:\testcode\include -U_WIN32 -U_WIN64
    還發現預設已定義的巨集中沒有包含 _DEBUG,在編譯除錯版程式時需要用到這個巨集,可以使用下面的命令:
gcc -c test.c -I C:\testcode\include -U_WIN32 -U_WIN64 -D_DEBUG

    用 GCC 編譯時發現不再報告處於 _WIN32 或 _WIN64 巨集定義中包含的語句錯誤了。接下來根據編譯結果給出的提示,修改了一些拼寫錯誤,成功生成了 test.o 檔案,證明該 C 程式能夠在 Linux 下通過編譯。等將來有空時安裝 Linux 虛擬機器,再將 C 程式及其呼叫的動態庫源程式都拿到 Linux 上編譯連結,就能生成 Linux 上的可執行程式了。

------------------------

說明
gcc 編譯選項:
-c 只編譯,不連結
-D 使用指定的巨集
-U 取消指定的巨集

 

 

出處:https://blog.csdn.net/henter/article/details/54863462