麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

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

2019-11-14 10:29:28
字體:
來源:轉載
供稿:網友
        最近用 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,下載網頁是:https://sourceforge.net/projects/mingw-w64/    運行程序 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 -c C程序名.c -I 頭文件所在路徑    比如可以是:gcc -c test.c -I C:/testcode/include    結果顯示了一大堆錯誤和警告。仔細一看,好像編譯報錯的程序語句都處于 _WIN32 或 _WIN64 宏定義中包含的部分。為什么會這樣?需要查看一下 GCC 編譯時默認已定義了哪些宏。在網上查到查看 GCC 編譯時默認宏的命令是:gcc -posix -E -dM - </dev/null    可是該命令在 Windows 的命令提示符窗口中無法執行。這該怎么辦呢?忽然想到這臺計算機上安裝過從 https://git-for-windows.github.io/ 上下載的 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 取消指定的宏


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 中文字幕免费在线观看视频 | 在线播放污 | av免费提供 | 国色天香综合网 | www噜噜偷拍在线视频 | 中国字幕av | 亚洲福利视频52 | 美国一级毛片片aa久久综合 | 啪啪毛片 | 成人在线观看一区二区三区 | 黄色毛片视频在线观看 | 欧美城网站地址 | 毛片成人 | 久久91精品国产91久久yfo | 国产盼盼私拍福利视频99 | 久久毛片免费观看 | 欧美淫交| 精品中文字幕久久久久四十五十骆 | 在线视频1区 | av7777777| 亚洲精品a级| 免费视频a| 欧洲精品久久久久69精品 | 4399一级成人毛片 | 欧产日产国产精品v | 久久蜜臀一区二区三区av | 高清在线观看av | 国产毛片自拍 | 一区二区国产在线 | 日韩色视频| 亚洲尻逼视频 | 久国产| 史上最强炼体老祖动漫在线观看 | 青青国产在线视频 | 国产18成人免费视频 | 日韩视频www | av在线免费电影 | 欧美日韩在线免费观看 | 国产一精品一av一免费爽爽 | 国产毛片毛片 | 亚洲第一激情 |