【Linux】gcc/g++的使用

C++编译之(1)-g++单/多文件/库的编译及C标准的发展历程 c++编译过程及c语言版本发展历程简介 阅读详情
图片名称
🎉博主首页: 有趣的中国人

🎉专栏首页: Linux


在这里插入图片描述

小伙伴们大家好,本片文章将会讲解Linux中gcc/g++使用的相关内容。


如果看到最后您觉得这篇文章写得不错,有所收获,麻烦点赞👍、收藏🌟、留下评论📝。您的支持是我最大的动力,让我们一起努力,共同成长!



1. 什么是gcc/g++


GCC(GNU Compiler Collection)是一套由GNU计划开发的编译器集合,它是一种开源的编译器套件,用于编译和运行C、C++、Fortran、Ada、以及其他一些编程语言的程序。其中,g++是GCC中专门用于编译C++程序的工具。

由于其开放源代码的特性,GCC已经成为许多操作系统和平台上的标准编译器,例如Linux、GNU Hurd、Mac OS X等。

g++是GCC中用于编译C++源代码的前端工具。它支持标准的C++语法和语言特性,并提供了丰富的编译选项和优化功能,以便用户根据需要进行配置和调整。使用g++,开发者可以将C++源代码编译成可执行程序或者库文件,从而在各种平台上运行他们的程序。


🔎关于C、C++的后缀🔍

在Linux系统中C语言正常以.c为后缀。

C++一般有三个后缀:

1. filename.cpp

2. filename.cc

3. filename.cxx

🔎安装gcc/g++🔍

输入命令安装gcc:

# 我这里已经下载过了
[dsj@alicloud-dsj ~]$ sudo yum install -y gcc # 输入此行命令即可下载
[sudo] password for dsj:                      # 这里要sudo提权,如果是root就不需要
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
base                                                                                                                                | 3.6 kB  00:00:00     
epel                                                                                                                                | 4.7 kB  00:00:00     
extras                                                                                                                              | 2.9 kB  00:00:00     
updates                                                                                                                             | 2.9 kB  00:00:00     
(1/3): epel/x86_64/updateinfo                                                                                                       | 1.0 MB  00:00:00     
(2/3): epel/x86_64/primary_db                                                                                                       | 7.0 MB  00:00:00     
(3/3): updates/7/x86_64/primary_db                                                                                                  |  27 MB  00:00:00     
Package gcc-4.8.5-44.el7.x86_64 already installed and latest version

输入命令安装g++:

# 我这里已经下载过了
[dsj@alicloud-dsj ~]$ sudo yum install gcc-c++  # 输入此行命令即可下载g++
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Package gcc-c++-4.8.5-44.el7.x86_64 already installed and latest version
Nothing to do

查看gcc/g++版本:

[dsj@alicloud-dsj ~]$ gcc --version #输入此行命令查看gcc版本
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[dsj@alicloud-dsj ~]$ g++ --version #输入此行命令查看g++版本
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

2. 编译运行gcc/g++的语法


🔎编译gcc的语法🔍

先确保我们目录中存在C文件,然后输入以下命令进行编译,生成可执行文件:

gcc [要编译的文件] -o[要生成的文件名]
or
gcc -o[要生成的文件名] [要编译的文件]

例如:

[dsj@alicloud-dsj lesson10]$ gcc test.c -o my.exe -std=c99 #输入-std=c99说明以c99标准进行编译
[dsj@alicloud-dsj lesson10]$ ll
total 16
-rwxrwxr-x 1 dsj dsj 8408 May  8 15:42 my.exe
-rw-rw-r-- 1 dsj dsj 3087 May  8 10:39 test.c

在这里插入图片描述

🔎编译g++的语法🔍

先确保我们目录中存在C++文件,然后输入以下命令进行编译,生成可执行文件:

g++ [要编译的文件] -o[要生成的文件名]
or
g++ -o[要生成的文件名] [要编译的文件]

例如:

[dsj@alicloud-dsj lesson10]$ g++ test.cc -o myc++.exe -std=c++11 #输入-std=c++11说明以c++11标准进行编译
[dsj@alicloud-dsj lesson10]$ ll
total 32
-rwxrwxr-x 1 dsj dsj 8976 May  8 15:52 myc++.exe
-rwxrwxr-x 1 dsj dsj 8408 May  8 15:42 my.exe
-rw-rw-r-- 1 dsj dsj 3087 May  8 10:39 test.c
-rw-rw-r-- 1 dsj dsj  141 May  8 15:52 test.cc

在这里插入图片描述


🔎运行可执行文件🔍

输入命令./[可执行文件名]即可运行。

在这里插入图片描述


3. gcc/g++编译的四个步骤


使用 GCC 或者 g++ 编译 C 或者 C++ 程序通常包括以下四个步骤:

1. 预处理

2. 编译

3. 汇编

4. 链接


3.1 🔎预处理🔍


在预处理阶段编译器通常会有以下步骤:

1. 头文件的展开

2. 宏替换

3. 去注释

4. 条件编译

我们可以输入以下命令让.c文件停留在预处理阶段进行查看:

[dsj@alicloud-dsj lesson10]$ gcc -E test.c -o test.i #输入这个命令
[dsj@alicloud-dsj lesson10]$ ll
total 52
-rwxrwxr-x 1 dsj dsj  8976 May  8 15:52 myc++.exe
-rwxrwxr-x 1 dsj dsj  8408 May  8 15:42 my.exe
-rw-rw-r-- 1 dsj dsj  3087 May  8 10:39 test.c
-rw-rw-r-- 1 dsj dsj   141 May  8 15:52 test.cc
-rw-rw-r-- 1 dsj dsj 17250 May  8 16:15 test.i #生成这个文件,停留在预处理阶段
[dsj@alicloud-dsj lesson10]$ vim test.i #输入此行命令查看test.i文件

查看此文件:

在这里插入图片描述


我们发现虽然源文件只有100多行,但是.i这个文件就有800多行,这是因为头文件被展开了,并且注释也被去除了,宏也被替换了。


💻条件编译

我们先用条件编译写一下如下的代码:

#include <stdio.h>

int main()
{
#ifdef V1
    printf("功能1\n");

#elif V2
    printf("功能1\n");
    printf("功能2\n");
    printf("功能3\n");
#else
    printf("功能1\n");
    printf("功能2\n");
    printf("功能3\n");
    printf("功能4\n");
    printf("功能5\n");
    printf("功能6\n");
#endif

    return 0;
}

因为这里并没有定义V1, V2,所以会执行else的内容:

在这里插入图片描述

我们可以在编译的时候输入以下指令就可以给源文件增加宏定义:

[dsj@alicloud-dsj test]$ gcc -D V1=1 test.c -o test.exe

在这里插入图片描述

3.2 🔎编译🔍


在编译阶段编译器通常会有以下步骤:

1. 生成汇编代码

2. 检查语法(词法分析、语法分析、语义分析等)

我们可以输入以下命令让.i文件停留在编译阶段进行查看:

[dsj@alicloud-dsj lesson10]$ gcc -S test.i -o test.s -std=c99

在这里插入图片描述

vim查看此文件:

在这里插入图片描述

3.3 🔎汇编🔍


在汇编阶段编译器主要会有以下步骤:

将汇编代码转换成机器可识别的二进制代码。


我们可以输入以下命令让`.s`文件停留在汇编阶段进行查看:
[dsj@alicloud-dsj lesson10]$ gcc -c test.s -o test.o

在这里插入图片描述

vim查看此文件:

在这里插入图片描述

emmmmm,发现是看不懂的二进制文件,没错,这是机器识别的文件,没打算给我们看懂。


3.4 🔎链接🔍


在链接阶段编译器通常会有以下步骤:

链接阶段就是将汇编阶段已经生成的二进制文件和所需要的库进行链接,最终生成可执行程序的过程。


我们可以输入以下命令让.o文件生成可执行程序:


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

3.5 🔎编译器的自举过程🔍


首先我们来思考一个问题:为什么在编译时必须要走这4个过程,不能直接到链接阶段生成可执行程序吗?要讲解这个问题我们先回溯一下历史:

回溯历史:

我们知道计算机最早的编程是通过那种打孔的小纸条来实现的,因为这样编程太过于复杂,随后又出现了汇编语言。

然而所有的计算机程序最终都需要被翻译成计算机能够理解的二进制形式才能执行,所以在汇编语言发行的时候肯定也解决了将汇编语言翻译成二进制形式的问题。

所以对于我们的C/C++语言,如果直接转换成二进制语言,实际上是可行的,但是实现起来难度太大,如果说运用前辈们的成果,先将C/C++翻译成汇编语言,在翻译成二进制语言,这样的难度肯定就会小很多,这就是为啥要经历编译、汇编等阶段的原因。

然而此时的问题又来了,第一个汇编语言程序是怎么被编译出来的呢?是依靠编译器吗?编译器又是哪款语言写的呢?

其实当汇编发行的时候,先用二进制语言写了一份汇编语言的编译器,然后就可以把汇编语言学的代码放到这个编译器中进行编译,因为编译器也是属于软件,所以我们也可以用汇编语言写一份汇编语言的编译器,再放到二进制语言写的汇编语言编译器中进行编译,就形成了汇编语言的编译器,这个过程就叫做编译器的自举。

下面是详细的解释:

编译器的自举是指用编程语言(例如汇编语言)编写一个编译器,然后使用该编译器来编译其自身的源代码。这个过程可以分为几个步骤:

  1. 编写第一个版本的编译器: 初始阶段,程序员会使用另一种已经存在的编程语言(通常是汇编语言或高级语言)来编写一个最基本的编译器。这个编译器可以将源代码(例如C语言)转换为目标机器的汇编语言或者机器码。
  2. 使用第一个编译器编译自身源代码: 一旦第一个版本的编译器完成,程序员会使用它来编译其自身的源代码。这意味着用该编译器编译的结果将是一个新版本的编译器。
  3. 重复此过程: 新版本的编译器可以更加完善和高效,程序员可以使用它来编译自身的源代码,生成更新的版本。这个过程可以一遍又一遍地重复,每一次迭代都会改进编译器的功能、性能和稳定性。

通过这种方式,编译器的自举实现了编译器的持续改进和演化。它也证明了编译器本身是一个软件程序,可以用其它编程语言来编写,而不仅仅局限于机器语言或者汇编语言。这个过程展示了计算机科学中有趣的自指特性。


4. 详解链接


刚才说过,链接实际上就是把汇编阶段生成的二进制目标文件和所需要的库文件相结合,形成可执行文件的过程。


那么问题来了,这个库是什么,它存在在那里,为什么就能找到呢?



我们接下来一一解答。

在我们的头文件中只是包含了一些内置类型函数的声明,例如下图的printf,那么具体的函数实现在哪里呢?

在这里插入图片描述

对于每一门语言,在被发行的时候都有自己的库函数,这里面存放这一些常用函数的具体实现(方法集),例如输入输出函数等,然后他会给出你一些头文件,这些头文件就相当于是这些库的说明书,供你使用。


并且在编译阶段编译器就会告诉你应该去哪个位置去找到对应的方法。


我们可以用一下命令看一下Linux下C所依赖的库是什么:


在这里插入图片描述

[dsj@alicloud-dsj lesson10]$ ldd test.exe
	linux-vdso.so.1 =>  (0x00007ffcfc7db000)
	libc.so.6 => /lib64/libc.so.6 (0x00007f6d9eb9d000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f6d9ef6b000)
[dsj@alicloud-dsj lesson10]$ ls /lib64/libc.so.6 -l
lrwxrwxrwx 1 root root 12 Sep 19  2023 /lib64/libc.so.6 -> libc-2.17.so
[dsj@alicloud-dsj lesson10]$ file test.exe
test.exe: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=946a88d4c5e0c0a19483beb1d83eeb28686d5d4e, not stripped
[dsj@alicloud-dsj lesson10]$ 


4.1 🔎动态库&动态链接🔍


我们可以看到C所依赖的库是 /lib64/libc.so.6,这个库中存放的就是内置给你的函数的具体实现方法,但是是二进制的文件,可以看一下:

在这里插入图片描述


💻动态库

这个库是以.so的后缀,一般以这个为后缀的文件就叫做动态库。


💻动态链接

动态链接就是在程序运行时由操作系统的动态链接器动态地加载动态链接库文件,不会在编译时将库文件的代码和数据合并到可执行文件中。

可以用file看一下文件的具体类型:

在这里插入图片描述

说明这个可执行文件是动态链接的(共享库也就是动态库)。

4.2 🔎静态库&静态链接🔍


💻静态库

在Linux中,静态库通常以.a为后缀,但是一般情况下不会自带,要自己手动下载。

💻静态库的下载

sudo yum install -y glibc-static # C语言静态库
sudo yum install -y libstdc+±static # C++静态库

这样我们编译一个文件就可以以静态的形式进行编译:

[dsj@alicloud-dsj lesson10]$ gcc test.c -o static_test.exe -static -std=c99

在这里插入图片描述

💻静态链接

在静态链接的情况下,编译器会在编译阶段将所需的库函数的代码和数据直接合并到最终的可执行程序中,而不是在运行时动态加载和链接库文件。

这意味着可执行文件会变得更大,因为它包含了所有依赖的库的代码和数据,但同时也意味着程序在运行时不需要依赖外部的库文件,因为所有的代码和数据都已经包含在可执行文件中了。

在这里插入图片描述

4.2 🔎动态库动态链接&静态库静态链接的优缺点🔍


动态库&动态链接:
1. 因为Linux中的很多指令都要依赖此动态库,因此他不能丢失
2. 它相较于静态链接更节省资源空间
静态库&静态链接
1. 因为静态链接会在编译阶段把所有需要的函数全都加载到内存中,因此它不需要依赖其他东西,和库无关,跨平台性较强
2. 但是太费资源、空间。

Linux——gcc/g++以及make/Makefile的使用 在Linux的系统中,想要完成代码编译,gcc/g++是不可缺少的工具,而make/Makefile能否熟练应用则从一个侧面体现出一个人是否有能力独自完成一个大型工程,而本篇文章就带领大家了解一些gcc/g++和make/Makefile使用的基础知识。 阅读详情

相关推荐

Linux——gcc/g++编译器

Linux ——gcc/g++的编译链接过程,目标文件对动静态链接方式,动静态库的区别

weixin_69283129的博客 4803

详解gcc/g++编译C/C++的具体过程

通过例子解释如何编译单个C/C++文件 如何编译多个C/C++文件

研究前沿技术,不要轻易掉队。 4322

GCC/G++编译C++/C文件生成可执行文件

GCC(GNU Compiler Collection)是一个常用的开源编译器套件,它支持多种编程语言,包括C和C++。本文将介绍如何使用GCC/G++编译C++/C文件并生成可执行文件。如果GCC已经安装,你将看到GCC的版本信息。以上就是使用GCC/G++编译C++/C文件并生成可执行文件的基本步骤。通过这些步骤,你可以轻松地将源代码编译成可执行文件,以便在不同的环境中运行和分享。类似地,如果你要编译一个C文件(例如hello.c),你可以使用GCC编译器。首先,确保已经安装了GCC/G++编译器。

PixelDude的博客 806

【C++】g++指令使用指南

【C++】g++指令使用指南

weixin_46274756的博客 1万+

使用g++编译c++文件的重要参数及编译实例

1 前言 VSCode是通过调用GCC编译器来实现C/C++的编译工作的 使用 gcc 指令编译 C 代码 使用 g++指令编译 C++ 代码 2 编译过程 预处理-Pre-Processing //.i文件 # -E 选项指示编译器仅对输入文件进行预处理 g++ -E test.cpp -o test.i //.i文件 编译-Compiling // .s文件 # -S 编译选项告诉 g++ 在为

zeeq的博客 2422

Windows11家庭版开启虚拟化与WSL安装操作手册

Windows 11 家庭版完全支持 WSL 2,无需升级到专业版即可享受 Linux 开发环境。通过本手册介绍的步骤,您可以顺利安装和配置 WSL,并掌握系统更新后的维护技巧。WSL 为开发者提供了在 Windows 环境下使用 Linux 工具链的便利,尤其适合需要跨平台开发的场景。随着使用深入,您会发现 WSL 生态系统的强大之处,它不仅能提高开发效率,还能让 Windows 用户体验到 Linux 的强大功能。建议定期查看微软官方文档,了解 WSL 的最新功能和最佳实践。

m0_54846764的博客 3023

Linux基础之gcc/g++

在我们写程序的时候,我们会发现我们明明没有实现输出的功能,却可以用printf这个函数将想要的内容打印到显示器上。这是因为我们使用这个函数是有前提的,我们需要包含一个stdio.h的头文件,这其实就是我们的前辈写好的库,而我们程序如果要用printf这个函数的话,就需要依赖于第三方库。在Linux中,我们可以使用相关指令去查看我们引用了哪些第三方库。ldd(list dynamic dependencies)是一个用于查看可执行文件或者共享库文件所依赖的动态链接库的命令。

JYXCZYH的博客 2019

无刷电机FOC控制入门:磁场、洛伦兹力与坐标转换详解

本文深入解析无刷电机FOC(磁场定向控制)的核心原理,从电磁学基础的磁场与洛伦兹力出发,详细阐述了如何通过Clarke变换、Park变换等坐标转换技术,将三相交流解耦为直流量进行控制,最终利用SVPWM技术实现平滑、高效的电机驱动。文章旨在帮助开发者理解FOC的物理本质与数学框架,为机器人、无人机等高性能应用奠定基础。

weixin_29306011的博客 267

Linux工具学习之【gcc/g++】

书接上文,我们已经学习了 Linux 中的编辑器 vim 的相关使用方法,现在已经能直接在 Linux 中编写C/C++代码,有了代码之后就要尝试去编译并运行它,此时就可以学习一下。

2401_83603768的博客 1593

CocosCreator | 自定义启动页之H5

01 效果对比 默认启动页: 自定义启动页: 02 启动页存在的意义 我们在 creator 中的开发的游戏都是基于 cocos engine,所以在展示我们的游戏之前,是必须要先加载 cocos engine,然后才是我们自己的业务代码 流程图如下: 而构建完成后未精简的 cocos engine 代码为 1.9M 如果再加上物理相关代码的话,一共是2M 别忘了,我们自己的首场景也要加载过程哦 所以,从游戏启动,到真...

Valiancer 5896

Vmware安装windowsServer2022版本

全网最详细的Vmware安装windowsServer2022版本

A乐神的博客 7006

Linux开发工具——gcc/g++

本文介绍了Linux下使用gcc/g++编译运行代码的完整流程。gcc用于C语言,g++兼容C++和C语言。编译过程分为预处理(宏替换、去注释)、编译(生成汇编)、汇编(生成机器码)和链接(生成可执行文件)四个步骤,可通过-E、-S、-c选项分步执行。文章还对比了静态库(.a)和动态库(.so)的特点:静态库独立但体积大,动态库共享但依赖性强。最后提供了常用gcc选项说明,包括优化级别、调试信息生成等实用编译参数。

lrhhappy的博客 1057

EtherCAT从站协议栈---- sampleappl.c 文件解析

这个源文件实际上包含该项目的入口函数main函数。 那么如何找到入口函数呢? 可以进入debug的simulator模式,选中run to main(), 当执行完启动文件startup_cm3.s后就进入了main函数(注意在main函数之前还进入了SystemInit函数), 如下图所示: 这个main函数主要架构如下: int main(void) { HW_Init(); /*PDI(过程数据接口)初始化,这里用的是MCI接.

Jiawei_Z的博客 3068

【Linux】Linux工具学习之gcc/g++

接上文,我们已经学习了Linux中的编辑器vim的,现在已经能直接在Linux中编写C/C++代码,有了代码之后就要尝试去编译并运行它,此时就可以学习一下Linux中的编译器gcc/g++了,我们一般使用gcc编译C语言,g++编译C++(当然g++也可编译C语言),这两个编译器我们可以当作一个来学习,因为它们的命令选项都是通用的,只是编译对象不同。除了编译器相关介绍外,本文还会库、自动化构建工具、提权等知识,一起来看看吧。

Aron的博客 1234

SAE ARP 4761A内容详解

SAE ARP 4761A主要为民用航空系统及设备的安全评估提供指南,帮助制造商和设计者满足FAA的FAR 25.1309等适航标准的要求。该文档旨在为航空器和航空系统设计中涉及的安全评估流程提供一个结构化的框架,并结合一系列工具和方法,如故障树分析(FTA)、依赖图分析(DD)、马尔可夫分析(MA)等,来系统地评估潜在的安全隐患。这一标准不仅适用于大型航空器的设计和评估,还可以应用于各种类型的飞行系统,如无人驾驶飞行器(UAV)和新型的电动垂直起降飞机(eVTOL)。

qq_41854911的博客 3149

PCL 平面点云的凹多边形边界提取【2025最新版】

平面点云的凹多边形边界提取及边界轮廓线绘制。博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 7183

【Linux成长史】Linux编辑器-gcc/g++使用

🎥 本文由 M malloc 原创,首发于 优快云🙉📆 未来很长,值得我们全力奔赴更美好的生活✨。

m0_64361522的博客 1341

【即插即用模块】注意力篇 | TGRS 2025 | MFA聚特征+HPDown保细节+HFF融层级,三大模块各司其职,性能翻倍!

本文介绍了MTMLNet网络中的三大核心模块:MFA(多阶段特征聚合)、HPDown(混合池化下采样)和HFF(分层特征融合)。MFA通过双尺度深度卷积和注意力机制增强特征提取能力;HPDown结合平均池化和最大池化,有效保留下采样过程中的特征信息;HFF采用三注意力机制实现自适应特征融合。这三个模块协同工作,在红外小目标检测与分割任务中取得了SOTA效果。实验表明,各模块在特征提取、信息保留和融合方面均优于传统方法,可灵活应用于各类视觉任务中。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 285

零基础上手gcc/g++:Linux编译轻松学

首先我们来学习一下gcc、g++二者之间的关系gcc英文全称为:GUN C Compiler,是GCC中的c编译器g++英文全称为:GUN C++ Compiler,是GCC中的c++编译器。gcc和g++ 两者都可以编译c和cpp文件,但存在差异。gcc在编译cpp时语法按照c来编译但默认不能链接到c++的库(gcc默认链接c库,g++默认链接c++库)。g++编译.c和.cpp文件都统一按cpp的语法规则来编译。所以一般编译c用gcc,编译c++用g++。

2301_80774875的博客 2298

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【Linux】gcc/g++配置

  教育的目的是让学生们摆脱现实的奴役,而现在的年轻人正意图做着相反的努力,为了适应现实而改变自己。

hsy1603914691的博客 975

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

在linux下使用gcc/g++编译.h .cpp文件

1.gcc编译C源码的四个步骤: 预处理->编译->汇编->链接(test.c test.h => test.i => test.s => test.o => test) 1)预处理 gcc -E test.c -o test.i 2)编译 gcc -S test.i -o test.s 3)汇编 gcc -c test.s -o test.o 4)链接 gcc test.o -o test 执行可执行文件test ./t...

不知小姐 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【linux】2 Linux编译器-gcc/g++和Linux调试器-gdb

Linux编译器-gcc/g++的使用、linux调试器-gdb的使用

m0_57388581的博客 2841

[Linux开发工具]——gcc/g++的使用

1.函数库函数库一般分为静态库和动态库两种。动静态库本质就是文件,头文件也是文件。2.动静态库优缺点(动态链接)优比较节省资源,不会出现太多的重复代码----资源磁盘,内存,网络等资源。缺点:对库的依赖性比较强----旦库丢失,所有使用这个库的程序都无法运行。(静态链接)优:不依赖库,同类型平台中都可以直接运行使用。缺点:可执行程序体积比较大,比较浪费资源----资源磁盘,内存,网络等资源3.生成动静态库的命令。

plj521的博客 1432

Linux编译器-gcc/g++使用

最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

sqm_C的博客 754
上一篇: 【Linux】Vim
下一篇: 【Linux】项目自动化构建工具make/makefile
有趣的中国人
博客等级 码龄5年 1585粉丝 85原创
评论 34
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值