一份简单的在 Linux下编译及调试 C 代码的指南

简介:

一份简单的在 Linux下编译及调试 C 代码的指南

对于Linux下的C程序员来说,几乎天天都会和Linux打交道。但在很多人的眼中,Linux是一个易用性极差、靠命令驱动的操作系统,根本无法与有着友好用户界面的Windows相比。确实是这样的,即使大家的程序是运行在Linux下,基于以下种种原因,我们的大部分工作还是在Windows下完成的:

第一,除了编译调试代码之外,每个程序员还有很多工作要做,像文档编写、邮件发送及回复、PPT制作等,这些工作在Windows下做要更方便快捷一些。

第二,公司及项目组的资源有限,一般不会为每个开发人员配备一台安装有Linux的机器,而是大家共用一台或少许几台Linux机器。在每台机器上建立多个用户,需要用来编译或调试程序的时候,大家用某个用户登录上去。

这样,问题就来了:自己平时是在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所示。


图1 登录界面

然后,单击图1中的“Connect”,在出现的界面上输入密码,如图2所示。

图2 密码输入界面

密码输入正确之后,便登录到了Linux系统下,如图3所示。

图3 登录成功之后的界面

为了编译自己的程序,我们需要建立自己的文件存放目录,如图4所示。

图4 新建个人目录

目录建立成功之后,我们便可以转到目录中去看一下,如图5所示。

图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. * 返 回 值:0-执行完毕
  19. * 其它说明:无
  20. * 修改日期 版本号 修改人 修改内容
  21. * -------------------------------------------------------------------
  22. * 201501028 V1.0 Zhou Zhaoxiong 创建
  23. ***********************************************************************/
  24. int main()
  25. {
  26. printf("Hello, world!\n");
  27. return 0;
  28. }

第二步:使用FileZilla将代码上传到Linux

将该“Hello.c”文件存放在D盘的“Test”文件夹下,并启动FileZilla,如图6所示。

图6 启动FileZilla之后的界面

在“主机(H)”中输入IP地址,在“用户名(U)”中输入“zxin10”用户名,在“密码(W)”中输入正确的密码,“端口(P)”可不填写而使用默认值,则可登录到Linux机器上去。登上去后,转到“zhouzx”目录下,并将“Hello.c”文件传上去,如图7所示。

图7 上传文件之后的界面

此时,“Hello.c”文件已经传到了“zhouzx”目录下,现在可以对该文件进行编译了。

第三步:在Linux上编译和运行程序。

使用“gcc -g -o Hello Hello.c”命令对文件进行编译,如图8所示。

图8 编译之后的结果

可以看到,编译成功之后,有“Hello”文件生成。紧接着,运行“Hello”命令,便可看到程序的输出结果,如图9所示。

图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. typedef unsigned char UINT8;
  18. typedef signed int INT32;
  19. typedef unsigned int UINT32;
  20. // 函数声明
  21. void Sleep(UINT32 iCountMs);
  22. void PrintInfo(void);
  23. INT32 main();
  24. /**********************************************************************
  25. * 功能描述:主函数
  26. * 输入参数:无
  27. * 输出参数:无
  28. * 返 回 值:无
  29. * 其它说明:无
  30. * 修改日期 版本号 修改人 修改内容
  31. * -------------------------------------------------------------------
  32. * 20151008 V1.0 Zhou Zhaoxiong 创建
  33. ***********************************************************************/
  34. INT32 main()
  35. {
  36. PrintInfo(); // 在屏幕上输出消息
  37. return 0;
  38. }
  39. /**********************************************************************
  40. * 功能描述: 在屏幕上输出消息
  41. * 输入参数: 无
  42. * 输出参数: 无
  43. * 返 回 值: 无
  44. * 其它说明: 无
  45. * 修改日期 版本号 修改人 修改内容
  46. * ----------------------------------------------------------------------
  47. * 20151008 V1.0 Zhou Zhaoxiong 创建
  48. ************************************************************************/
  49. void PrintInfo(void)
  50. {
  51. UINT32 iLoopFlag = 0;
  52. UINT32 iSum = 0;
  53. UINT32 iLen = 0;
  54. UINT8 *pCtrStr = NULL;
  55. iLen = strlen(pCtrStr);
  56. for (iLoopFlag = 0; iLoopFlag < iLen; iLoopFlag ++) // 打印消息iLen次
  57. {
  58. printf("PrintInfo: hello, world!\n");
  59. iSum = iSum + iLoopFlag;
  60. Sleep(10 * 1000); // 每10s打印一次
  61. }
  62. return;
  63. }
  64. /**********************************************************************
  65. * 功能描述: 程序休眠
  66. * 输入参数: iCountMs-休眠时间(单位:ms)
  67. * 输出参数: 无
  68. * 返 回 值: 无
  69. * 其它说明: 无
  70. * 修改日期 版本号 修改人 修改内容
  71. * ------------------------------------------------------------------
  72. * 20151008 V1.0 Zhou Zhaoxiong 创建
  73. ********************************************************************/
  74. void Sleep(UINT32 iCountMs)
  75. {
  76. struct timeval t_timeout = {0};
  77. if (iCountMs < 1000)
  78. {
  79. t_timeout.tv_sec = 0;
  80. t_timeout.tv_usec = iCountMs * 1000;
  81. }
  82. else
  83. {
  84. t_timeout.tv_sec = iCountMs / 1000;
  85. t_timeout.tv_usec = (iCountMs % 1000) * 1000;
  86. }
  87. select(0, NULL, NULL, NULL, &t_timeout); // 调用select函数阻塞程序
  88. }

用gdb分析core文件

在Linux上用“gcc -g -o GdbDebug GdbDebug.c”命令对程序进行编译之后,运行“GdbDebug”命令,发现在当前目录下出现了core文件。利用gdb命令对core文件进行分析的过程如下所示:


  
  
  1. ~/zhouzhaoxiong/zzx/GdbDebug> gdb GdbDebug core -- 启动gdbcore文件的分析
  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. Breakpoint 1, main () at GdbDebug.c:41
  30. 41 PrintInfo(); // 在屏幕上输出消息
  31. (gdb) n -- 执行下一步
  32. Breakpoint 2, PrintInfo () at GdbDebug.c:64
  33. 64 iLen = strlen(pCtrStr);
  34. (gdb) p iLen -- 打印(输出)iLen的值
  35. $1 = 0
  36. (gdb) p iLoopFlag -- 打印(输出)iLoopFlag的值
  37. $2 = 0
  38. (gdb) c -- 继续执行
  39. Continuing.
  40. Program received signal SIGSEGV, Segmentation fault. -- 程序core掉了
  41. 0x00007ffff7ae9812 in __strlen_sse2 () from /lib64/libc.so.6
  42. (gdb) q -- 退出gdb
  43. A debugging session is active.
  44. Inferior 1 [process 26640] will be killed.
  45. Quit anyway? (y or n) y
  46. ~/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. typedef unsigned char UINT8;
  18. typedef signed int INT32;
  19. typedef unsigned int UINT32;
  20. // 函数声明
  21. void Sleep(UINT32 iCountMs);
  22. void PrintInfo(void);
  23. INT32 main();
  24. /**********************************************************************
  25. * 功能描述:主函数
  26. * 输入参数:无
  27. * 输出参数:无
  28. * 返 回 值:无
  29. * 其它说明:无
  30. * 修改日期 版本号 修改人 修改内容
  31. * -------------------------------------------------------------------
  32. * 20151008 V1.0 Zhou Zhaoxiong 创建
  33. ***********************************************************************/
  34. INT32 main()
  35. {
  36. PrintInfo(); // 在屏幕上输出消息
  37. return 0;
  38. }
  39. /**********************************************************************
  40. * 功能描述: 在屏幕上输出消息
  41. * 输入参数: 无
  42. * 输出参数: 无
  43. * 返 回 值: 无
  44. * 其它说明: 无
  45. * 修改日期 版本号 修改人 修改内容
  46. * ----------------------------------------------------------------------
  47. * 20151008 V1.0 Zhou Zhaoxiong 创建
  48. ************************************************************************/
  49. void PrintInfo(void)
  50. {
  51. UINT32 iLoopFlag = 0;
  52. UINT32 iSum = 0;
  53. UINT32 iLen = 0;
  54. UINT8 *pCtrStr = "hello, world!"; // 修改了这行代码
  55. iLen = strlen(pCtrStr);
  56. for (iLoopFlag = 0; iLoopFlag < iLen; iLoopFlag ++) // 打印消息iLen次
  57. {
  58. printf("PrintInfo: hello, world!\n");
  59. iSum = iSum + iLoopFlag;
  60. Sleep(10 * 1000); // 每10s打印一次
  61. }
  62. return;
  63. }
  64. /**********************************************************************
  65. * 功能描述: 程序休眠
  66. * 输入参数: iCountMs-休眠时间(单位:ms)
  67. * 输出参数: 无
  68. * 返 回 值: 无
  69. * 其它说明: 无
  70. * 修改日期 版本号 修改人 修改内容
  71. * ------------------------------------------------------------------
  72. * 20151008 V1.0 Zhou Zhaoxiong 创建
  73. ********************************************************************/
  74. void Sleep(UINT32 iCountMs)
  75. {
  76. struct timeval t_timeout = {0};
  77. if (iCountMs < 1000)
  78. {
  79. t_timeout.tv_sec = 0;
  80. t_timeout.tv_usec = iCountMs * 1000;
  81. }
  82. else
  83. {
  84. t_timeout.tv_sec = iCountMs / 1000;
  85. t_timeout.tv_usec = (iCountMs % 1000) * 1000;
  86. }
  87. select(0, NULL, NULL, NULL, &t_timeout); // 调用select函数阻塞程序
  88. }

编译并运行之后,程序正常,说明问题已被我们解决掉。下面是常见的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. Breakpoint 1, PrintInfo () at GdbDebug.c:64
  23. 64 iLen = strlen(pCtrStr);
  24. (gdb) p iLen -- 打印(输出)iLen的值
  25. $1 = 0
  26. (gdb) n -- 执行下一步
  27. 66 for (iLoopFlag = 0; iLoopFlag < iLen; iLoopFlag ++) // 打印消息iLen次
  28. (gdb) n -- 执行下一步
  29. 68 printf("PrintInfo: hello, world!\n");
  30. (gdb) p iLoopFlag -- 打印(输出)iLoopFlag的值
  31. $2 = 0
  32. (gdb) p iLen -- 打印(输出)iLen的值
  33. $3 = 13
  34. (gdb) n -- 执行下一步
  35. PrintInfo: hello, world! -- 程序的输出结果
  36. 70 iSum = iSum + iLoopFlag;
  37. (gdb) p iSum -- 打印(输出)iSum的值
  38. $4 = 0
  39. (gdb) n -- 执行下一步
  40. Breakpoint 2, PrintInfo () at GdbDebug.c:72
  41. 72 Sleep(10 * 1000); // 每10s打印一次
  42. (gdb) n
  43. 66 for (iLoopFlag = 0; iLoopFlag < iLen; iLoopFlag ++) // 打印消息iLen次
  44. (gdb) p iLoopFlag
  45. $5 = 0
  46. (gdb) n
  47. 68 printf("PrintInfo: hello, world!\n");
  48. (gdb) p iLoopFlag
  49. $6 = 1
  50. (gdb) n
  51. PrintInfo: hello, world!
  52. 70 iSum = iSum + iLoopFlag;
  53. (gdb) p iSum
  54. $7 = 0
  55. (gdb) n
  56. Breakpoint 2, PrintInfo () at GdbDebug.c:72
  57. 72 Sleep(10 * 1000); // 每10s打印一次
  58. (gdb) p iSum
  59. $8 = 1
  60. (gdb) finish -- 一直运行到函数返回
  61. Run till exit from #0 PrintInfo () at GdbDebug.c:72
  62. PrintInfo: hello, world!
  63. Breakpoint 2, PrintInfo () at GdbDebug.c:72
  64. 72 Sleep(10 * 1000); // 每10s打印一次
  65. (gdb) c -- 继续执行
  66. Continuing.
  67. PrintInfo: hello, world!
  68. Breakpoint 2, PrintInfo () at GdbDebug.c:72
  69. 72 Sleep(10 * 1000); // 每10s打印一次
  70. (gdb) bt -- 打印当前的函数调用栈的所有信息
  71. #0 PrintInfo () at GdbDebug.c:72
  72. #1 0x00000000004005e5 in main () at GdbDebug.c:41
  73. (gdb) q -- 退出gdb
  74. A debugging session is active.
  75. Inferior 1 [process 26685] will be killed.
  76. Quit anyway? (y or n) y
  77. ~/zhouzhaoxiong/zzx/GdbDebug>

作为Linux下调试C/C++程序的工具,大家一定要熟练掌握gdb的用法。

总结

Linux具有免费、可靠、安全、稳定、多平台等特点,因此深受全球各大IT厂商的追捧。Linux操作系统的两大主要应用领域是服务器领域和嵌入式Linux系统。不管你从事的开发工作是否与Linux有关,掌握Linux下的软件开发方法总是有好处的。

本文来自云栖社区合作伙伴“Linux中国”,原文发表于2013-04-02.

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
28天前
|
Linux 编译器 开发工具
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
【Linux快速入门(三)】Linux与ROS学习之编译基础(Cmake编译)
|
6天前
|
运维 监控 Linux
BPF及Linux性能调试探索初探
BPF技术从最初的网络数据包过滤发展为强大的系统性能优化工具,无需修改内核代码即可实现实时监控、动态调整和精确分析。本文深入探讨BPF在Linux性能调试中的应用,介绍bpftune和BPF-tools等工具,并通过具体案例展示其优化效果。
35 14
|
1月前
|
缓存 NoSQL Linux
Linux调试
本文介绍了Linux调试、性能分析和追踪的培训资料,涵盖调试、性能分析和追踪的基础知识及常用工具。
229 6
Linux调试
|
1月前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
109 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
|
1月前
|
Linux
Linux - 如何编译源码安装软件
源码编译安装通常包括三个步骤:1) `./configure` 检测平台特征和依赖项,生成 Makefile;2) `make` 编译源码,生成可执行文件;3) `make install` 将可执行文件安装到指定目录并配置环境变量。
49 0
|
2月前
|
Linux 编译器 C语言
Linux c/c++之多文档编译
这篇文章介绍了在Linux操作系统下使用gcc编译器进行C/C++多文件编译的方法和步骤。
45 0
Linux c/c++之多文档编译
|
2月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
338 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
3月前
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
65 3