成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在 Linux下編譯及調試 C 代碼的簡易指南

開發 后端
對于Linux下的C程序員來 說,幾乎天天都會和Linux打交道。但在很多人的眼中,Linux是一個易用性極差、靠命令驅動的操作系統,根本無法與有著友好用戶界面的 Windows相比。確實是這樣的,即使大家的程序是運行在Linux下,基于以下種種原因,我們的大部分工作還是在Windows下完成的:

對于Linux下的C程序員來 說,幾乎天天都會和Linux打交道。但在很多人的眼中,Linux是一個易用性極差、靠命令驅動的操作系統,根本無法與有著友好用戶界面的 Windows相比。確實是這樣的,即使大家的程序是運行在Linux下,基于以下種種原因,我們的大部分工作還是在Windows下完成的:

第一,除了編譯調試代碼之外,每個程序員還有很多工作要做,像文檔編寫、郵件發送及回復、PPT制作等,這些工作在Windows下做要更方便快捷一些。

第二,公司及項目組的資源有限,一般不會為每個開發人員配備一臺安裝有Linux的機器,而是大家共用一臺或少許幾臺Linux機器。在每臺機器上建立多個用戶,需要用來編譯或調試程序的時候,大家用某個用戶登錄上去。

[[155714]]

這樣,問題就來了:自己平時是在Windows下面辦公的,而自己編寫的程序的運行環境又是Linux的,如何從Windows切換到Linux呢?是不是要到專門的Linux機器上去編寫代碼呢?我們如何在Linux下調試程序呢?本文將一一道來。

到Linux下去編譯運行程序的步驟

只要在Windows下安裝一個叫做SecureCRT的軟件和一個叫做FileZilla的軟件,便可輕松實現Windows到Linux的切換。
SecureCRT是一款支持SSH(SSH1和SSH2)的終端仿真程序,簡單地說是Windows下登錄Linux服務器主機的軟件。 FileZilla是一個免費開源的FTP軟件,分為客戶端版本和服務器版本兩種,具備所有的FTP軟件功能。(編者注:SecureCRT 是版權軟件,建議使用開源的 Putty 替代,不過切記勿在搜索引擎隨便搜索下載。)

在使用SecureCRT和FileZilla之前,要確保有一臺安裝了Linux的機器處于運行狀態(一般說來,每個開發小組都會有專門用于測試 程序的機器,可以在此機器上安裝Linux)。作者使用的Linux機器的IP地址為xx.xx.xx.xx,用戶名為zxin10,密碼為yyyy。

第一步:使用SecureCRT登錄Linux

打開SecureCRT軟件,在界面上輸入IP和用戶名,如圖1所示。

一份簡單的在 Linux下編譯及調試 C 代碼的指南
圖1 登錄界面

然后,單擊圖1中的“Connect”,在出現的界面上輸入密碼,如圖2所示。

一份簡單的在 Linux下編譯及調試 C 代碼的指南

圖2 密碼輸入界面

密碼輸入正確之后,便登錄到了Linux系統下,如圖3所示。

一份簡單的在 Linux下編譯及調試 C 代碼的指南

圖3 登錄成功之后的界面

為了編譯自己的程序,我們需要建立自己的文件存放目錄,如圖4所示。

一份簡單的在 Linux下編譯及調試 C 代碼的指南

圖4 新建個人目錄

目錄建立成功之后,我們便可以轉到目錄中去看一下,如圖5所示。

一份簡單的在 Linux下編譯及調試 C 代碼的指南

圖5 轉到新建目錄

此時,“萬事俱備,只欠東風”,我們接下來要做的工作是利用FileZilla軟件將自己在Windows下編寫的程序傳上去。

示例程序如下:

  1. /********************************************************************** 
  2. * 版權所有 (C)2015, Zhou Zhaoxiong。 
  3. * 
  4. * 文件名稱:Hello.c 
  5. * 文件標識:無 
  6. * 內容摘要:演示Windows下編寫的程序如何在Linux下執行 
  7. * 其它說明:無 
  8. * 當前版本:V1.0 
  9. * 作    者:Zhou Zhaoxiong 
  10. * 完成日期:201501028 
  11. * 
  12. **********************************************************************/ 
  13. #include <stdio.h> 
  14.  
  15. /********************************************************************** 
  16. * 功能描述:主函數 
  17. * 輸入參數:無 
  18. * 輸出參數:無 
  19. * 返 回 值:0-執行完畢 
  20. * 其它說明:無 
  21. * 修改日期            版本號     修改人                修改內容 
  22. * ------------------------------------------------------------------- 
  23. * 201501028        V1.0     Zhou Zhaoxiong        創建 
  24. ***********************************************************************/ 
  25. int main() 
  26.     printf("Hello, world!/n"); 
  27.  
  28.     return 0

第二步:使用FileZilla將代碼上傳到Linux

將該“Hello.c”文件存放在D盤的“Test”文件夾下,并啟動FileZilla,如圖6所示。

一份簡單的在 Linux下編譯及調試 C 代碼的指南

圖6 啟動FileZilla之后的界面

在“主機(H)”中輸入IP地址,在“用戶名(U)”中輸入“zxin10”用戶名,在“密碼(W)”中輸入正確的密碼,“端口(P)”可不填寫而 使用默認值,則可登錄到Linux機器上去。登上去后,轉到“zhouzx”目錄下,并將“Hello.c”文件傳上去,如圖7所示。

一份簡單的在 Linux下編譯及調試 C 代碼的指南

圖7 上傳文件之后的界面

此時,“Hello.c”文件已經傳到了“zhouzx”目錄下,現在可以對該文件進行編譯了。

第三步:在Linux上編譯和運行程序。

使用“gcc -g -o Hello Hello.c”命令對文件進行編譯,如圖8所示。

一份簡單的在 Linux下編譯及調試 C 代碼的指南

圖8 編譯之后的結果

可以看到,編譯成功之后,有“Hello”文件生成。緊接著,運行“Hello”命令,便可看到程序的輸出結果,如圖9所示。

一份簡單的在 Linux下編譯及調試 C 代碼的指南

圖9 程序的輸出結果

以上便是將Windows下的程序放到Linux下去編譯和運行的全過程。這里只是示例了簡單的程序,實際軟件開發項目中的程序要復雜很多,但基本 操作流程都是類似的。當然,直接在Linux下編寫程序也是可以的,如可以利用VI編輯器來寫程序。但由于易用性的原因,我認為,在Windows下編寫 程序要更方便一點。大家要根據自己的習慣及項目組的要求來選擇合理的代碼編寫的方式。

程序調試示例—用gdb分析core文件

在實際的軟件開發項目中,程序出現問題是在所難免的。遙想本人參加工作之后首次遇到程序的情景,至今還歷歷在目。之前的經驗告訴我,我們越是驚慌失措,問題就越是解決不了。我們要先讓自己平靜下來,然后再尋找解決程序問題的辦法。

在Linux下做開發的朋友,想必都與core文件打過交道。當看到自己的程序運行之后出現core時,很多人都慌亂了,仿佛天快要塌下來一樣。其 實,我們大可不必如此,只要我們掌握了用gdb調試core文件的辦法,依然可以很快定位程序問題,一舉將bug消滅掉。有關Linux core文件的更多介紹,請閱讀此文

這里以一個實際的程序為例,以用gdb分析core文件為例介紹了Linux下程序調試的方法,同時演示了常見gdb命令的操作方法。

在Linux下執行“ulimit –a”命令查看程序運行出錯時是否會產生core文件,命令執行的結果中有“core file size = 0”表示不會產生core文件,此時要使用“ulimit -c 1000000”命令設置core文件的大小。

示例程序

 

  1. /********************************************************************** 
  2. * 版權所有 (C)2015, Zhou Zhaoxiong。 
  3. * 
  4. * 文件名稱:GdbDebug.c 
  5. * 文件標識:無 
  6. * 內容摘要:Gdb命令演示程序 
  7. * 其它說明:無 
  8. * 當前版本:V1.0 
  9. * 作    者:Zhou Zhaoxiong 
  10. * 完成日期:20151008 
  11. * 
  12. **********************************************************************/ 
  13. #include <stdio.h> 
  14. #include <stdlib.h> 
  15. #include <string.h> 
  16.  
  17. // 數據類型重定義 
  18. typedef unsigned char       UINT8; 
  19. typedef signed   int        INT32; 
  20. typedef unsigned int        UINT32; 
  21.  
  22. // 函數聲明 
  23. void Sleep(UINT32 iCountMs); 
  24. void PrintInfo(void); 
  25. INT32 main(); 
  26.  
  27. /********************************************************************** 
  28. * 功能描述:主函數 
  29. * 輸入參數:無 
  30. * 輸出參數:無 
  31. * 返 回 值:無 
  32. * 其它說明:無 
  33. * 修改日期        版本號     修改人            修改內容 
  34. * ------------------------------------------------------------------- 
  35. * 20151008       V1.0     Zhou Zhaoxiong      創建 
  36. ***********************************************************************/ 
  37. INT32 main() 
  38.     PrintInfo();   // 在屏幕上輸出消息 
  39.  
  40.     return 0
  41.  
  42. /********************************************************************** 
  43. * 功能描述: 在屏幕上輸出消息 
  44. * 輸入參數: 無 
  45. * 輸出參數: 無 
  46. * 返 回 值: 無 
  47. * 其它說明: 無 
  48. * 修改日期            版本號            修改人           修改內容 
  49. * ---------------------------------------------------------------------- 
  50. * 20151008            V1.0        Zhou Zhaoxiong        創建 
  51. ************************************************************************/ 
  52. void PrintInfo(void
  53.     UINT32 iLoopFlag = 0
  54.     UINT32 iSum      = 0
  55.     UINT32 iLen      = 0
  56.     UINT8 *pCtrStr   = NULL; 
  57.  
  58.     iLen = strlen(pCtrStr); 
  59.  
  60.     for (iLoopFlag = 0; iLoopFlag < iLen; iLoopFlag ++)      // 打印消息iLen次 
  61.     { 
  62.         printf("PrintInfo: hello, world!/n"); 
  63.  
  64.         iSum = iSum + iLoopFlag; 
  65.  
  66.         Sleep(10 * 1000);   // 每10s打印一次 
  67.     } 
  68.  
  69.     return
  70.  
  71. /********************************************************************** 
  72. * 功能描述: 程序休眠 
  73. * 輸入參數: iCountMs-休眠時間(單位:ms) 
  74. * 輸出參數: 無 
  75. * 返 回 值: 無 
  76. * 其它說明: 無 
  77. * 修改日期          版本號       修改人              修改內容 
  78. * ------------------------------------------------------------------ 
  79. * 20151008         V1.0     Zhou Zhaoxiong          創建 
  80. ********************************************************************/ 
  81. void Sleep(UINT32 iCountMs) 
  82.     struct timeval t_timeout = {0}; 
  83.  
  84.     if (iCountMs < 1000
  85.     { 
  86.         t_timeout.tv_sec = 0
  87.         t_timeout.tv_usec = iCountMs * 1000
  88.     } 
  89.     else 
  90.     { 
  91.         t_timeout.tv_sec = iCountMs / 1000
  92.         t_timeout.tv_usec = (iCountMs % 1000) * 1000
  93.     } 
  94.     select(0, NULL, NULL, NULL, &t_timeout);   // 調用select函數阻塞程序 

用gdb分析core文件

在Linux上用“gcc -g -o GdbDebug GdbDebug.c”命令對程序進行編譯之后,運行“GdbDebug”命令,發現在當前目錄下出現了core文件。利用gdb命令對core文件進行分析的過程如下所示:

 

  1. ~/zhouzhaoxiong/zzx/GdbDebug> gdb GdbDebug core     -- 啟動gdb對core文件的分析 
  2. GNU gdb (GDB) SUSE (7.3-0.6.1
  3. Copyright (C) 2011 Free Software Foundation, Inc. 
  4. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
  5. This is free software: you are free to change and redistribute it. 
  6. There is NO WARRANTY, to the extent permitted by law.  Type "show copying" 
  7. and "show warranty" for details. 
  8. This GDB was configured as "x86_64-suse-linux"
  9. For bug reporting instructions, please see: 
  10. <http://www.gnu.org/software/gdb/bugs/>... 
  11. Reading symbols from /home/zhou/zhouzhaoxiong/zzx/GdbDebug/GdbDebug...done. 
  12. Core was generated by `GdbDebug'. 
  13. Program terminated with signal 11, Segmentation fault. 
  14. #0  0x00007f4a736f9812 in __strlen_sse2 () from /lib64/libc.so.6 
  15. (gdb) where          -- 查看程序出問題的地方 
  16. #0  0x00007f4a736f9812 in __strlen_sse2 () from /lib64/libc.so.6 
  17. #1  0x000000000040061a in PrintInfo () at GdbDebug.c:64   -- 可以看到,在GdbDebug.c文件的第64行出的問題 
  18. #2  0x00000000004005e5 in main () at GdbDebug.c:41 
  19. (gdb) b 41           -- 在GdbDebug.c文件第41行設立斷點 
  20. Breakpoint 1 at 0x4005e0: file GdbDebug.c, line 41
  21. (gdb) b 64           -- 在GdbDebug.c文件第64行設立斷點 
  22. Breakpoint 2 at 0x400611: file GdbDebug.c, line 64
  23. (gdb) info b         -- 顯示斷點信息 
  24. Num     Type           Disp Enb Address            What 
  25. 1       breakpoint     keep y   0x00000000004005e0 in main at GdbDebug.c:41 
  26. 2       breakpoint     keep y   0x0000000000400611 in PrintInfo at GdbDebug.c:64 
  27. (gdb) r              -- 運行GdbDebug 
  28. Starting program: /home/zhou/zhouzhaoxiong/zzx/GdbDebug/GdbDebug 
  29.  
  30. Breakpoint 1, main () at GdbDebug.c:41 
  31. 41          PrintInfo();   // 在屏幕上輸出消息 
  32. (gdb) n             -- 執行下一步 
  33.  
  34. Breakpoint 2, PrintInfo () at GdbDebug.c:64 
  35. 64              iLen = strlen(pCtrStr); 
  36. (gdb) p iLen        -- 打印(輸出)iLen的值 
  37. $1 = 0 
  38. (gdb) p iLoopFlag   -- 打印(輸出)iLoopFlag的值 
  39. $2 = 0 
  40. (gdb) c             -- 繼續執行     
  41. Continuing. 
  42.  
  43. Program received signal SIGSEGV, Segmentation fault.    -- 程序core掉了 
  44. 0x00007ffff7ae9812 in __strlen_sse2 () from /lib64/libc.so.6 
  45. (gdb) q             -- 退出gdb 
  46. A debugging session is active. 
  47.  
  48.         Inferior 1 [process 26640] will be killed. 
  49.  
  50. Quit anyway? (y or n) y 
  51. ~/zhouzhaoxiong/zzx/GdbDebug> 

從以上分析可知,執行GdbDebug.c文件的第64行時程序core掉了。此時仔細分析程序,發現pCtrStr指針為空。當對一個不存在的指針取長度時,由于找不到地址,程序便崩潰了。修改的辦法也非常的簡單,只需要讓pCtrStr指針指向具體的地址即可。

常見gdb命令操作示例

修改之后的代碼如下:

 

  1. /********************************************************************** 
  2. * 版權所有 (C)2015, Zhou Zhaoxiong。 
  3. * 
  4. * 文件名稱:GdbDebug.c 
  5. * 文件標識:無 
  6. * 內容摘要:Gdb命令演示程序 
  7. * 其它說明:無 
  8. * 當前版本:V1.0 
  9. * 作    者:Zhou Zhaoxiong 
  10. * 完成日期:20151008 
  11. * 
  12. **********************************************************************/ 
  13. #include <stdio.h> 
  14. #include <stdlib.h> 
  15. #include <string.h> 
  16.  
  17. // 數據類型重定義 
  18. typedef unsigned char       UINT8; 
  19. typedef signed   int        INT32; 
  20. typedef unsigned int        UINT32; 
  21.  
  22. // 函數聲明 
  23. void Sleep(UINT32 iCountMs); 
  24. void PrintInfo(void); 
  25. INT32 main(); 
  26.  
  27. /********************************************************************** 
  28. * 功能描述:主函數 
  29. * 輸入參數:無 
  30. * 輸出參數:無 
  31. * 返 回 值:無 
  32. * 其它說明:無 
  33. * 修改日期        版本號     修改人            修改內容 
  34. * ------------------------------------------------------------------- 
  35. * 20151008       V1.0    Zhou Zhaoxiong       創建 
  36. ***********************************************************************/ 
  37. INT32 main() 
  38.     PrintInfo();   // 在屏幕上輸出消息 
  39.  
  40.     return 0
  41.  
  42. /********************************************************************** 
  43. * 功能描述: 在屏幕上輸出消息 
  44. * 輸入參數: 無 
  45. * 輸出參數: 無 
  46. * 返 回 值: 無 
  47. * 其它說明: 無 
  48. * 修改日期            版本號            修改人           修改內容 
  49. * ---------------------------------------------------------------------- 
  50. * 20151008           V1.0         Zhou Zhaoxiong        創建 
  51. ************************************************************************/ 
  52. void PrintInfo(void
  53.     UINT32 iLoopFlag = 0
  54.     UINT32 iSum      = 0
  55.     UINT32 iLen      = 0
  56.     UINT8 *pCtrStr   = "hello, world!";  // 修改了這行代碼 
  57.  
  58.     iLen = strlen(pCtrStr); 
  59.  
  60.     for (iLoopFlag = 0; iLoopFlag < iLen; iLoopFlag ++)      // 打印消息iLen次 
  61.     { 
  62.         printf("PrintInfo: hello, world!/n"); 
  63.  
  64.         iSum = iSum + iLoopFlag; 
  65.  
  66.         Sleep(10 * 1000);   // 每10s打印一次 
  67.     } 
  68.  
  69.     return
  70.  
  71. /********************************************************************** 
  72. * 功能描述: 程序休眠 
  73. * 輸入參數: iCountMs-休眠時間(單位:ms) 
  74. * 輸出參數: 無 
  75. * 返 回 值: 無 
  76. * 其它說明: 無 
  77. * 修改日期          版本號       修改人              修改內容 
  78. * ------------------------------------------------------------------ 
  79. * 20151008         V1.0     Zhou Zhaoxiong          創建 
  80. ********************************************************************/ 
  81. void Sleep(UINT32 iCountMs) 
  82.     struct timeval t_timeout = {0}; 
  83.  
  84.     if (iCountMs < 1000
  85.     { 
  86.         t_timeout.tv_sec = 0
  87.         t_timeout.tv_usec = iCountMs * 1000
  88.     } 
  89.     else 
  90.     { 
  91.         t_timeout.tv_sec = iCountMs / 1000
  92.         t_timeout.tv_usec = (iCountMs % 1000) * 1000
  93.     } 
  94.     select(0, NULL, NULL, NULL, &t_timeout);   // 調用select函數阻塞程序 

編譯并運行之后,程序正常,說明問題已被我們解決掉。下面是常見的gdb命令的操作示例:

 

  1. ~/zhouzhaoxiong/zzx/GdbDebug> gdb GdbDebug    -- 啟動gdb調試 
  2. GNU gdb (GDB) SUSE (7.3-0.6.1
  3. Copyright (C) 2011 Free Software Foundation, Inc. 
  4. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
  5. This is free software: you are free to change and redistribute it. 
  6. There is NO WARRANTY, to the extent permitted by law.  Type "show copying" 
  7. and "show warranty" for details. 
  8. This GDB was configured as "x86_64-suse-linux"
  9. For bug reporting instructions, please see: 
  10. <http://www.gnu.org/software/gdb/bugs/>... 
  11. Reading symbols from /home/zhou/zhouzhaoxiong/zzx/GdbDebug/GdbDebug...done. 
  12. (gdb) b 64     -- 在GdbDebug.c文件第64行設立斷點 
  13. Breakpoint 1 at 0x400611: file GdbDebug.c, line 64
  14. (gdb) b 72     -- 在GdbDebug.c文件第72行設立斷點 
  15. Breakpoint 2 at 0x400637: file GdbDebug.c, line 72
  16. (gdb) info b   -- 顯示斷點信息 
  17. Num     Type           Disp Enb Address            What 
  18. 1       breakpoint     keep y   0x0000000000400611 in PrintInfo at GdbDebug.c:64 
  19. 2       breakpoint     keep y   0x0000000000400637 in PrintInfo at GdbDebug.c:72 
  20. (gdb) r        -- 運行GdbDebug 
  21. Starting program: /home/zhou/zhouzhaoxiong/zzx/GdbDebug/GdbDebug 
  22.  
  23. Breakpoint 1, PrintInfo () at GdbDebug.c:64 
  24. 64              iLen = strlen(pCtrStr); 
  25. (gdb) p iLen    -- 打印(輸出)iLen的值 
  26. $1 = 0 
  27. (gdb) n         -- 執行下一步 
  28. 66              for (iLoopFlag = 0; iLoopFlag < iLen; iLoopFlag ++)      // 打印消息iLen次 
  29. (gdb) n         -- 執行下一步 
  30. 68              printf("PrintInfo: hello, world!/n"); 
  31. (gdb) p iLoopFlag   -- 打印(輸出)iLoopFlag的值 
  32. $2 = 0 
  33. (gdb) p iLen    -- 打印(輸出)iLen的值 
  34. $3 = 13 
  35. (gdb) n         -- 執行下一步 
  36. PrintInfo: hello, world!    -- 程序的輸出結果 
  37. 70                      iSum = iSum + iLoopFlag; 
  38. (gdb) p iSum    -- 打印(輸出)iSum的值 
  39. $4 = 0 
  40. (gdb) n        -- 執行下一步 
  41.  
  42. Breakpoint 2, PrintInfo () at GdbDebug.c:72 
  43. 72                      Sleep(10 * 1000);   // 每10s打印一次 
  44. (gdb) n      
  45. 66              for (iLoopFlag = 0; iLoopFlag < iLen; iLoopFlag ++)      // 打印消息iLen次 
  46. (gdb) p iLoopFlag 
  47. $5 = 0 
  48. (gdb) n 
  49. 68              printf("PrintInfo: hello, world!/n"); 
  50. (gdb) p iLoopFlag 
  51. $6 = 1 
  52. (gdb) n 
  53. PrintInfo: hello, world! 
  54. 70                      iSum = iSum + iLoopFlag; 
  55. (gdb) p iSum 
  56. $7 = 0 
  57. (gdb) n 
  58.  
  59. Breakpoint 2, PrintInfo () at GdbDebug.c:72 
  60. 72                      Sleep(10 * 1000);   // 每10s打印一次 
  61. (gdb) p iSum 
  62. $8 = 1 
  63. (gdb) finish        -- 一直運行到函數返回 
  64. Run till exit from #0  PrintInfo () at GdbDebug.c:72 
  65. PrintInfo: hello, world! 
  66.  
  67. Breakpoint 2, PrintInfo () at GdbDebug.c:72 
  68. 72                      Sleep(10 * 1000);   // 每10s打印一次 
  69. (gdb) c           -- 繼續執行 
  70. Continuing. 
  71. PrintInfo: hello, world! 
  72.  
  73. Breakpoint 2, PrintInfo () at GdbDebug.c:72 
  74. 72                      Sleep(10 * 1000);   // 每10s打印一次 
  75. (gdb) bt            -- 打印當前的函數調用棧的所有信息 
  76. #0  PrintInfo () at GdbDebug.c:72 
  77. #1  0x00000000004005e5 in main () at GdbDebug.c:41 
  78. (gdb) q              -- 退出gdb 
  79. A debugging session is active. 
  80.  
  81.         Inferior 1 [process 26685] will be killed. 
  82.  
  83. Quit anyway? (y or n) y 
  84. ~/zhouzhaoxiong/zzx/GdbDebug> 

作為Linux下調試C/C++程序的工具,大家一定要熟練掌握gdb的用法。

總結

Linux具有免費、可靠、安全、穩定、多平臺等特點,因此深受全球各大IT廠商的追捧。Linux操作系統的兩大主要應用領域是服務器領域和嵌入式Linux系統。不管你從事的開發工作是否與Linux有關,掌握Linux下的軟件開發方法總是有好處的。

責任編輯:王雪燕 來源: daxixiong
相關推薦

2011-08-09 15:47:46

LeveldbLinuxC++

2010-02-02 15:13:42

Linux ARM

2009-12-17 10:05:07

LinuxdtAgeiaPhys

2009-07-14 16:41:43

Eclipse下配置J

2011-07-01 13:31:29

Ubuntu Linux QVFB

2020-09-13 09:19:10

LinuxPython3.6

2010-01-15 10:31:19

Linux編譯

2017-02-06 18:42:37

Linuxgdb程序

2020-08-17 07:00:00

數據遷移數據中心技術

2010-01-14 10:42:08

C++源代碼

2009-12-08 12:24:36

LinuxNTFS分區寫操作

2010-01-27 13:53:40

強大的CC++編譯器

2011-04-02 14:21:45

MRTGWINDOWS安裝

2016-12-30 09:23:06

Linux代碼文件

2023-10-05 15:47:04

Linux內核編譯

2017-03-27 15:15:43

Hive源碼編譯

2012-09-21 10:30:56

Linux項目代碼覆蓋率

2011-03-08 10:18:18

Visual StudMongoDB

2011-01-14 17:00:11

Linux內存泄露

2021-12-16 15:09:45

PythonBeautiful S編程語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久久久久久久久久久 | 四虎影视免费在线 | www.亚洲| 亚洲+变态+欧美+另类+精品 | 特级特黄特色的免费大片 | 欧美一级在线观看 | 少妇诱惑av | 久久精品欧美一区二区三区不卡 | 97视频精品 | 黄色成人av | 欧美成人精品一区二区三区 | 久久久久久国产精品免费免费 | 在线免费观看黄色网址 | 日韩欧美一区在线 | 日本超碰 | 国产一区免费 | 精品一区二区三区四区 | 久久久.com| 91精品久久久久久久久 | 亚洲一视频 | 欧美日韩精品久久久免费观看 | 国产特级毛片aaaaaa | 欧美日韩黄 | 亚洲人精品 | 亚洲国产一区二区三区 | 免费一区二区三区 | 午夜在线视频 | 国产激情视频网址 | 99欧美精品 | 宅女噜噜66国产精品观看免费 | 精品国产伦一区二区三区观看方式 | 国产精品久久久久久久久久不蜜臀 | 久久久一区二区三区 | 日韩精品一区二区三区视频播放 | 成人免费观看男女羞羞视频 | 超碰8| 日韩成人中文字幕 | 亚洲午夜小视频 | 国产成人免费 | 精品在线观看一区二区 | 黄视频国产 |