Unix 环境高级编程(一):开发环境

2023-05-16

Unix 环境高级编程(一):开发环境

  • 一、Unix操作系统
  • 二、Linux操作系统
  • 三、GNU编译工具(GCC)
    • 1、简介
    • 2、基本用法
    • 3、文件后缀
    • 4、构建过程
    • 5、预处理指令
    • 6、预定义宏
    • 7、环境变量
  • 四、静态库
    • 1、简介
    • 2、创建静态库
    • 3、ar 指令
    • 4、调用静态库
  • 五、共享库
    • 1、简介
    • 2、创建共享库
    • 3、调用共享库
    • 3、运行
  • 六、动态加载共享库
    • 1、头文件
    • 2、加载共享库
    • 3、获取函数地址
    • 4、卸载共享库
    • 5、 获取错误信息
  • 七、辅助工具

一、Unix操作系统

二、Linux操作系统

三、GNU编译工具(GCC)

1、简介

  GCC是以GPL许可证所发行的自由软件,也是GNU计划的关键部分。GCC的初衷是为GNU操作系统专门编写一款编译器,现已被大多数类Unix操作系统(如Linux、BSD、MacOS X等)采纳为标准的编译器,甚至在微软的Windows上也可以使用GCC。GCC支持多种计算机体系结构芯片,如x86、ARM、MIPS等,并已被移植到其他多种硬件平台。

  GCC原名为GNU C语言编译器(GNU C Compiler),只能处理C语言。但其很快扩展,变得可处理C++,后来又扩展为能够支持更多编程语言,如Fortran、Pascal、Objective -C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。

2、基本用法

gcc [options] [filenames] 
/* GCC最基本的用法是∶gcc [options] [filenames] 
 * 其中 options 就是编译器所需要的参数
 * filenames 给出相关的文件名称
 * */

-c /* 只编译,不链接成为可执行文件,
	* 编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,
	* 通常用于编译不包含主程序的子程序文件 
	* */
	
-o /* output_filename,确定输出文件的名称为output_filename,
	* 同时这个名称不能和源文件同名。
	* 如果不给出这个选项,gcc就给出预设的可执行文件a.out 
	* */

-x /* 设定文件所使用的语言, 使后缀名无效, 对以后的多个有效
	* 根据约定 C 语言的后缀名称是 .c 的,
	* 而 C++ 的后缀名是 .C 或者 .cpp, 
	* 如果你很个性,决定你的 C 代码文件的后缀名是 .pig ,
	* 那你就要用这个参数, 这个参数对他后面的文件名都起作用,
	* 除非到了下一个参数的使用
	*  */

-I /* Idirname,
	* 将dirname所指出的目录加入到程序头文件目录列表中,
	* 是在预编译过程中使用的参数 
	* */

-E /* 只激活预处理,这个不生成文件, 
	* 你需要把它重定向到一个输出文件里面 
	* */

-S /* 只激活预处理和编译,就是指把文件编译成为汇编代码 */
	
-g /* 产生符号调试工具(GNU的gdb)所必要的符号资讯,
	* 要想对源代码进行调试,我们就必须加入这个选项
	*  */

-O /* 对程序进行优化编译、链接,
	* 采用这个选项,整个源代码会在编译、链接过程中进行优化处理,
	* 这样产生的可执行文件的执行效率可以提高,
	* 但是,编译、链接的速度就相应地要慢一些 
	* */

-v 			/*  gcc执行时执行的详细过程,gcc及其相关程序的版本号 */

-pedantic 	/* 对不符合ANSI/ISO C语言标准的扩展语法产生警告 */

-Wall 		/* 产生尽可能多的警告 */

-Werror 	/* 将警告作为错误处理 */

3、文件后缀

.c		/* C语言源代码文件 */

.h		/* 程序所包含的头文件 */

.i		/* 预处理后的C语言源代码文件 */

.s		/* 汇编语言文件 */

.S		/* 经过预编译的汇编语言源代码文件 */

.o		/* 编译后的目标文件 */

.a		/* 静态库文件 */

.so		/* 共享库(动态库)文件 */

4、构建过程

编辑 -> 预编译(预处理)-> 编译 -> 汇编 -> 链接

  1. 编辑(hello.c)
/* 使用 vim 编辑器编写代码 */
vim hello.c
  1. 预编译(hello.i)
/* 使用 -E 选项,生成 .i 预编译文件
 * 这个过程处理宏定义和include,去除注释,不会对语法进行检查
 */
gcc -E hello.c -o hello.i
  1. 编译(hello.s)
/* 使用 -S 选项,生成 .s 汇编文件
 * 这个阶段,检查语法
 */
gcc -S hello.i
  1. 汇编(hello.o)
/* 使用 -c 选项,生成 .o 目标文件 */
gcc -c hello.s
  1. 链接(hello)
/* 使用 -o 选项,生成可执行文件 */
gcc hello.o -o hello

5、预处理指令

#include      // 将指定文件的内容插至此指令处 
#include_next // 与#include一样,但从当前目录之后的目录查找,极少用
#define       // 定义宏
#undef        // 删除宏
#if           // 判定
#ifdef        // 判定宏是否已定义
#ifndef       // 判定宏是否未定义
#else         // 与#if、#ifdef、#ifndef结合使用
#elif         // else if多选分支
#endif        // 结束判定
##            // 连接宏内两个连续的字符串
#             // 将宏参数扩展成字符串字面值
#error        // 产生错误,结束预处理
#warning      // 产生警告
#pragma       // 提供额外信息的标准方法,可用于指定平台
#pragma GCC dependency <文件>     // 若<文件>比此文件新则产生警告
#pragma GCC poison <标识>         // 若出现<标识>则产生错 误
#pragma pack(1/2/4/8)             // 按1/2/4/8字节对齐补齐
#line                             // 指定行号

For example:

  1. error.c
#include <stdio.h>

#if (VERSION < 1)
	#error "Version is too low!"
#elif (VERSION > 4)
	#warning "version is too high!"
#endif

int main(void)
{
	printf("Version is :%d\n", VERSION);

	return 0;
}

在这里插入图片描述

  1. line.c
#include <stdio.h>

int main(void)
{
	printf("line is %d\n", __LINE__);
#line 100
	printf("line is %d\n", __LINE__);	

	return 0;
}

在这里插入图片描述

  1. pragma.c
#include <stdio.h>

#pragma GCC dependency "tmp.c" // 若tmp.c比此文件新则产生警告

int main(void)
{
		

	return 0;
}

在这里插入图片描述

#include <stdio.h>

#pragma GCC poison goto float  // 若出现 goto 或 float 则产生错误

int main(void)
{

	float a;
		
loop :
	goto loop;

	return 0;
}

在这里插入图片描述

/* 64位操作系统下,默认8字节对齐 */
#include <stdio.h>

#pragma pack(1)
    struct S1 
    {
        double d;
        char   c;
        int    i;
        short  h;
    }; // DDDDDDDDCIIIIHH, 15
#pragma pack(4)
    struct S2 
    {
        double d;
        char   c;
        int    i;
        short  h;
    }; // DDDDDDDDCXXXIIIIHHXX, 20
#pragma pack(8)
    struct S3 
    {
        double d;
        char   c;
        int    i;
        short  h;
    }; // DDDDDDDDCXXXXXXXIIIIHHXX, 24


int main(void)
{
#pragma pack()
    printf ("S1: %lu字节\n", sizeof (struct S1));
    printf ("S2: %lu字节\n", sizeof (struct S2));
    printf ("S3: %lu字节\n", sizeof (struct S3));

	return 0;
}

在这里插入图片描述

6、预定义宏

__BASE_FILE__     // 正在编译的源文件名
__FILE__          // 所在文件名
__LINE__          // 行号
__FUNCTION__      // 函数名
__func__          // 同__FUNCTION__
__DATE__          // 日期
__TIME__          // 时间
__INCLUDE_LEVEL__ // 包含层数,从0开始
__cplusplus       // C++编译器将其定义为1,
                  // C编译器不定义该宏

For example:

  1. print.h
#ifndef _PRINT_H
#define _PRINT_H

#include <stdio.h>

void print (void) 
{
    printf ("__BASE_FILE__     : %s\n", __BASE_FILE__);
    printf ("__FILE__          : %s\n", __FILE__);
    printf ("__LINE__          : %d\n", __LINE__);
    printf ("__FUNCTION__      : %s\n", __FUNCTION__);
    printf ("__func__          : %s\n", __func__);
    printf ("__DATE__          : %s\n", __DATE__);
    printf ("__TIME__          : %s\n", __TIME__);
    printf ("__INCLUDE_LEVEL__ : %d\n", __INCLUDE_LEVEL__);
#ifdef __cplusplus
    printf ("__cplusplus       : %d\n", __cplusplus);
#endif // __cplusplus
}

#endif//_PRINT_H
  1. predef.h
#ifndef _PREDEF_H
#define _PREDEF_H

#include "print.h"

#endif//_PREDEF_H

  1. predef.c
#include "predef.h"


int main (void) 
{
    print ();
    return 0;
}

在这里插入图片描述
在这里插入图片描述

7、环境变量

C_INCLUDE_PATH     // C头文件的附加搜索路径,相当于gcc的-I选项
CPATH              // 同C_INCLUDE_PATH
CPLUS_INCLUDE_PATH // C++头文件的附加搜索路径
LIBRARY_PATH       // 链接时查找静态库/共享库的路径
LD_LIBRARY_PATH    // 运行时查找共享库的路径
  1. 通过gcc的-I选项指定C/C++头文件的附加搜索路径
gcc calc.c cpath.c -I.
  1. 将当前目录作为C头文件附加搜索路径,添加到CPATH环境变量中
export CPATH=$CPATH:. // export保证当前shell的,子进程继承此环境变量
echo $CPATH
env | grep CPATH
  1. 也可以在/.bashrc或/.bash_profile,配置文件中写环境变量,永久有效
export CPATH=$CPATH:.
执行
# source ~/.bashrc 或 # source ~/.bash_profile
//生效,以后每次登录自动生效。
  1. 头文件的三种定位方式
    a)#include “目录/xxx.h”
      头文件路径发生变化,需要修改源程序
    b)C_INCLUDE_PATH/CPATH=目录
      同时构建多个工程,可能引发冲突
    c)gcc -I目录
      既不用改程序,也不会有冲突
  2. 头文件的作用
    a)声明外部变量、函数和类
    b)定义宏、类型别名和自定义类型
    c)包含其它头文件
    d)借助头文件卫士,防止因同一个头文件被多次包含,而引发重定义错
  3. 包含头文件时需要注意的问题
    a)gcc的-I选项
      指定头文件附加搜索路径
    b)#include <…>
      先找-I指定的目录,再找系统目录
    c)#include “…”
      先找-I指定的目录,再找当前目录,最后找系统目录
    d)头文件的系统目录
/usr/include 
/usr/local/include 
/usr/lib/gcc/x86_64-linux-gnu/5.4.0/include

四、静态库

1、简介

  1. 链接静态库是将库中的被调用代码复制到调用模块中
  2. 静态库占用空间非常大,不易修改但执行效率高
  3. 静态库的缺省扩展名是.a

2、创建静态库

  1. 编辑源代码
vim xxx.c/xxx.h
  1. 编译成目标文件
gcc -c xxx.c -o xxx.o
  1. 打包成静态库文件
ar -r libxxx.a xxx.o ...

3、ar 指令

ar指令:ar [选项] 静态库文件名 目标文件列表 
-r // 将目标文件插入到静态库中,已存在则更新 
-q // 将目标文件追加到静态库尾 
-d // 从静态库中删除目标文件 
-t // 列表显示静态库中的目标文件 
-x // 将静态库展开为目标文件 
/* 注意:提供静态库的同时也需要提供头文件 */

4、调用静态库

  1. 直接调用
gcc main.c libxxx.a
  1. 通过LIBRARY_PATH环境变量指定库路径
export LIBRARY_PATH=$LIBRARY_PATH:.
gcc main.c -lmath (环境法)
  1. 通过gcc的-L选项指定库路径
unset LIBRARY_PATH
gcc main.c -lmath -L. (参数法)
  1. 一般化的方法:
gcc .c/.o -l<库名> -L<库路径>
  1. 运行
      在可执行程序的链接阶段,已将所调用的函数的二进制代码,复制到可执行程序中,因此运行时不需要依赖静态库。

五、共享库

1、简介

  1. 链接共享库则只是在调用模块中,嵌入被调用代码在库中的(相对)地址
  2. 共享库占用空间小,易于修改但执行效率略低
  3. 共享库的缺省扩展名是.so

2、创建共享库

  1. 编辑源程序
vim xxx.x/xxx.h
  1. 编译成目标文件
gcc -c -fpic xxx.c
  1. 链接成共享库文件
gcc -shared xxx.o -o libxxx.so
  1. PIC (Position Independent Code)
      位置无关代码。可执行程序加载它们时,可将其映射到其地址空间的任何位置。
-fPIC // 大模式,生成代码比较大,运行速度比较慢,所有平台都支持。 
-fpic // 小模式,生成代码比较小,运行速度比较快,仅部分平台支持。 
/* 注意:提供共享库的同时也需要提供头文件 */

3、调用共享库

  1. 直接调用
gcc main.c libxxx.so
  1. 通过LIBRARY_PATH环境变量指定库路径
export LIBRARY_PATH=$LIBRARY_PATH:.
gcc main.c -lmath (环境法)
  1. 通过gcc的-L选项指定库路径
unset LIBRARY_PATH
gcc main.c -lmath -L. (参数法)
  1. 一般化的方法
gcc .c/.o -l<库名> -L<库路径>

3、运行

  运行时需要保证LD_LIBRARY_PATH,环境变量中包含共享库所在的路径。
  在可执行程序的链接阶段,并不将所调用函数的二进制代码复制到可执行程序中。
  而只是将该函数在共享库中的地址嵌入到可执行程序中,因此运行时需要依赖共享库。
  gcc缺省链接共享库,可通过-static选项强制链接静态库。

六、动态加载共享库

1、头文件

#include <dlfcn.h>

2、加载共享库

/*
* 返回值:
* 		成功返回共享库句柄,失败返回NULL。
* 
* 参数:
*   filename:共享库路径
*      若只给文件名,则根据LD_LIBRARY_PATH环境变量搜索。
*   flag取值:加载方式
*      RTLD_LAZY - 延迟加载,使用共享库中的符号 (如调用函数)时才加载。 
*      RTLD_NOW  - 立即加载。
*/
void* dlopen (const char* filename,    int flag);

3、获取函数地址

/*
 * 返回值:
 * 		成功返回函数地址,失败返回NULL。
 * 
 * 参数:
 * 		hanedle:共享库句柄
 * 		symbol:函数名
 */
void* dlsym (void* handle,const char* symbol );

4、卸载共享库

/*
 * 成功返回0,失败返回非零。
 */
int dlclose (void* handle);

5、 获取错误信息

/*
 * 有错误发生则返回错误信息字符串指针,否则返回NULL。
 */
char* dlerror (void);

七、辅助工具

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unix 环境高级编程(一):开发环境 的相关文章

  • adb dumpsys命令用法

    dumpsys命令功能很强大 xff0c 能dump系统服务的各种状态 xff0c 非常有必要熟悉该命令的用法以及含义 一 概述 1 1 dumpsys命令用法 可通过dumpsys命令查询系统服务的运行状态 对象的成员变量属性值 xff0
  • Python if-else使用

    1 从键盘上输 个数 xff0c 显示它的绝对值 不允许使 abs num 61 float input 34 请输入一个实数 xff1a 34 if num gt 0 print num else print num 2 假设 户名为ad
  • Ubuntu 串口工具 —— cutecom

    串口调试工具 xff1a cutecom xff08 非常好用 xff09 安装 xff1a span class token function sudo span span class token function apt get spa
  • Android Camera 预览拉伸问题

    预览会出现拉伸的问题代码 xff1a 预览拉伸Demo 预览画面拉伸问题改正的 gitee 代码在文章最后给出 预览拉伸的原因 xff1a 每颗Camera都支持一些分辨率 xff0c Camera的这些图像如果和预览画面的宽高比例不一致就
  • Dockerfile关键字详解

    文章目录 一 Dockerfile基础知识二 Dockerfile常用的指令三 Dockerfile实战测试1 编写如下Dockerfile文件 xff0c 创建自己的centos镜像2 编译镜像3 测试运行 一 Dockerfile基础知
  • docker search 命令详解

    原文链接 docker search 命令详解 文章目录 一 docker search 命令选项二 docker search 使用实例2 1 通过指定镜像名搜索2 2 搜索结果不进行截断显示2 3 设置搜索结果只显示10个2 4 搜索结
  • “lib32ncurses5 : Depends: libc6-i386 (>= 2.18) but it is not going to be installed”类似问题解决办法

    问题背景 在64位Linux操作系统的主机上安装32位的交叉编译链时 xff0c 如果64位系统与32位的工具链不兼容 xff0c 在我们使用工具链对代码进行交叉编译时 xff0c 往往会出现明明工具链已经安装到了指定的目录下 xff0c
  • Spring框架基础知识概述

    目录 第一章 xff1a Spring概述第二章 xff1a Spring的第一个核心功能 xff1a ioc第三章 xff1a spring的第二个核心功能 xff1a aop第四章 xff1a 把mybatis框架和spring集成在一
  • 有关Opencv Undefined Reference to cv::Mat::updateContinuityFlag()编译问题的解决

    VScode编译中opencv的undefined reference 问题 一般来说 xff0c undefined reference to cv 等的问题是关于编译时依赖文件的问题 xff0c 应该将包含库的路径弄好了就没问题 xff
  • 利用MVC编写GUI程序-----梯形的面积(JAVA实用教程2-第五版 第九章 编程题 三(3)小题)

    span class token punctuation span span class token number 3 span span class token punctuation span 编写一个体现MVC结构的GUI程序 首先编
  • VMware安装Centos7系统(命令行模式)

    文章目录 一 准备软件 系统镜像二 创建新虚拟机三 安装CentOS7系统四 配置固定IP便于远程管理 一 准备软件 系统镜像 软件 xff1a VMware 14 镜像 xff1a CentOS7 镜像官网下载地址 xff1a http
  • mariadb(mysql)数据库字符集设置(二)(centos7)

    mariadb xff08 mysql xff09 数据库在存储数据时 xff0c 默认编码为latinl xff0c 当存储数据为中文字符时 xff0c 在显示或者web调用时会显示为乱码 xff0c 为解决该乱码问题 xff0c 需修改
  • 「第四范式」2023届-秋季校园招聘正式启动!

  • ubuntu安装chrome报错libnss3

    1 下载官网提供的最新版本 xff08 注意区分32位和64位 xff09 2 进入到文件所在路径 xff0c 执行安装命令 xff1a cd Downloads Downloads sudo dpkg i google chrome st
  • 16-命令模式Quarkus实现

    摘要 xff1a 本文用一个实例场景描述Gof 23设计模式中的命令 xff08 Command xff09 模式 xff0c 并用Quarkus框架代码给予实现 xff0c 同时也给出实现代码的UML模型 关键字 xff1a Gof 23
  • ubuntu16.04设置root用户登陆图形界面的方法

    因为 ubuntu 默认不能使用root登录图形界面 xff0c 且Ubuntu默认的是root用户不能登录图形界面的 xff0c 只能以其他用户登录图形界面 这样就很麻烦 xff0c 因为权限的问题 xff0c 不能随意复制删除文件 xf
  • 详解MariaDB数据库的存储过程

    1 什么是存储过程 很多时候 xff0c SQL语句都是针对一个或多个表的单条语句 但是也有时候有的查询语句需要进行多次联表查询才能完成 xff0c 此时就需要用到存储过程了 存储过程 xff08 Stored Procedure xff0
  • Tensorflow读取数据--TFrecord格式

    一 什么是Tfrecord xff1f TFRecords可以允许你讲任意的数据转换为TensorFlow所支持的格式 xff0c 这种方法可以使TensorFlow的数据集更容易与网络应用架构相匹配 这种建议的方法就是使用TFRecord
  • kafka架构、producer及consumer流程图

    1 kafka架构 xff1a 2 producer流程 xff1a 3 consumer流程 xff1a
  • Ubuntu18.04下安装OpenCv依赖包libjasper-dev

    问题 Ubuntu18 4下使用sudo apt get install libjaster dev安装包时提示找不到这个包 解决办法 终端中输入以下代码即可解决 span class token function sudo span ad

随机推荐

  • Nginx应用知识汇总

    一 Nginx是什么 xff1f Nginx engine x 是一个高性能的HTTP和反向代理web服务器 Nginx是一款轻量级的Web 服务器 反向代理服务器及电子邮件 xff08 IMAP POP3 xff09 代理服务器 xff0
  • JAVA学习代码——txt写入学生信息

    涉及 xff1a list的使用和遍历 文件的读 循环控制语句的使用 文件操作类 xff1a FileOperation package file import java io BufferedReader import java io B
  • 怎样把WORD中的错误一次性全部忽略

    1 审阅 选项 拼写和语法 点击全部忽略 2 或者打开word选项 校对 将键入时检查拼写勾选项去掉 xff0c 或者勾选下面的两项例外项 xff0c 不显示拼写和语法错误 xff0c 确定 这样就不会再检查你的拼写 xff0c 不用忽略了
  • 知识图谱前沿技术课程(华东师范大学站)

    知识图谱表达了各类实体 概念及其之间的各种语义关系 xff0c 成为了大数据时代知识表示的主要形态之一 知识图谱是目前人工智能领域的一个重要支撑 xff0c 已经在诸如智能问答 搜索 推荐等具体领域得到很好的应用 华东师范大学计算机应用研究
  • Win10白色图标制作及替换

    win10白色图标制作 xff1a 一 软件准备 IcoFX xff1a 提取图标 生成图标 Photoshop xff1a 修改编辑图标 二 制作步骤 1 提取图标 打开IcoFX xff0c 直接在桌面上选择快捷方式 xff0c 拉拽以
  • Java中输出当前时间的各种方法

    import java text import java util class Example public static void main String args TimeZone setDefault TimeZone getTime
  • VMware无法打开已存在虚拟机vmx文件解决办法

    复制过来的虚拟机文件 在 VMware 无法直接打开 xff08 文件 打开 无反应 xff09 解决办法 xff1a 1 首先打开vmx文件 xff0c 将ios路径设置正确 2 将虚拟机进程关闭 3 在文件管理器中右键vmx文件 xff
  • 使用cmd命令行查看wifi密码

    1 xff1a 在命令行输入下面命令 xff0c 查询本机存储WIFI xff1a netsh wlan show profiles 2 xff1a 输入下面命令查询WIFI密码 xff0c 第二张图显示的就是WIFI密码 netsh wl
  • Kettle 7.1 资源库配置&&无法配置资源库&&自定义配置文件路径

    资源库配置 1 kettle 7 1 资源库配置在左上角的Connect 2 点击Connect xff0c 弹出默认资源库 xff1a Pentaho Repository 3 在弹出窗口选择other Repositories 选择对应
  • oracle 数据库 日期时间整理

    oracle 数据库 日期时间整理 一 xff1a 日期格式 1 xff09 年 xff1a YYYY或yyyy xff08 可以截取1 4位 xff09 select to char sysdate 39 yyyy 39 from dua
  • 指针+1,怎么加?

    指针 43 1 指针 xff0b 1 xff0c 是加一个单元格还是加一个字节呢 xff0c 先看一个程序 xff1a include lt stdio h gt int main int arr 61 1 2 3 4 5 6 7 8 9
  • kail linux 虚拟机安装

    kail linux 虚拟机安装 系统介绍 Kali Linux是基于Debian的Linux发行版 xff0c 设计用于数字取证操作系统 每一季度更新一次 由Offensive Security Ltd维护和资助 最先由Offensive
  • kali 桌面设置:风格设置

    sudo apt install lightdm sudo dpkg reconfigure lightdm lightdm gdm3 事件的起因是kali安装wine32 Kali中安装wine是能成功的 xff0c 三十使用tim需要w
  • CentOS yum方式升级内核kernel

    xff08 此方法只限于CentOS派系的yum rpm 补充 xff1a 限于64Bit CentOS7的32位 xff0c 我试过用CentOS6的32位内核来升级 xff0c 可升级可重启可使用 xff0c 半个小时后删除了此系统没再
  • dlang语法的简单整理

    dlang整理 为什么使用dlang 优点 xff1a 快速 xff0c 开发高效的 xff0c 方便 xff0c 无虚拟机的 xff0c 快速的 xff0c 高性能的 垃圾回收 缺点 xff1a 语法较为复杂 xff0c 支持gc 曾经很
  • Linux基础命令-netstat显示网络状态

    Linux基础命令 ss显示socket信息 文章目录 netstat 命令介绍 语法格式 基本参数 显示各列内容分析 1 xff09 netstat a显示各列内容分析 2 xff09 netstat r显示各列内容分析 3 xff09
  • R语言igraph包的使用

    igraph包是一个用来解决图与网络问题以及对其进行可视化的包 前几天数学建模做图论的作业我就是用的这个包 xff0c 这篇博客就写一下如何解决图论中的最短路问题 xff0c 最大流问题和最小生成树问题 xff0c 以及图的可视化 需要声明
  • C++ sizeof

    sizeof xff1a 运算符 xff0c 返回类型或数据对象的长度 xff0c 单位为字节 用法 xff1a 数据类型 xff1a sizeof char xff1a 返回对应长度 普通变量 xff1a sizeof a xff1a 返
  • VisualGDB的基本使用

    在Linux下调试工程是一件很苦逼的事情 xff0c 不像在Windows下用Visual Studio那样简便 xff0c 但是最近发现一件神器可以让Linux下的程序一样可以在Windows下的Viusal Studio中调试起来 Vi
  • Unix 环境高级编程(一):开发环境

    Unix 环境高级编程 xff08 一 xff09 xff1a 开发环境 一 Unix操作系统二 Linux操作系统三 GNU编译工具 xff08 GCC xff09 1 简介2 基本用法3 文件后缀4 构建过程5 预处理指令6 预定义宏7