gcc简单入门

GCC -O 优化等级详解 GCC提供选项控制代码的优化等级: 这些选项可以实现不同程度的优化。 没有任何优化选项的话,编译时的目标是降低编译成本,并使调试产生预期的结果。语句是独立的:如果你使程序停止在语句之间设置的断点处,你可以改变任何变量的值或者改变程序计数器的值使程序执行任意函数中的语句并得到源代码中期望的结果。 打开优化标志使编译器尝试以编译时间和可能的调试程序的能力为代价来改进性能和/或代码大小。 编译器... 阅读详情

gcc编译过程

这里写图片描述
1. 预处理:头文件、宏展开
2. 编译:
3. 汇编:生成目标文件
4. 链接:链接其他的程序库生成可执行文件
接下来先看gcc的常用选项

-o :产生目标(.i、.s、.o、可执行文件等
-E:只运行C预编译器
-S:告诉编译器产生汇编语言文件后停止编译,产生的汇编语言文件扩展名为.s
-c:通知gcc取消链接步骤,即编译源码并在最后生成目标文件
-Wall:使gcc对源文件的代码有问题的地方发出警告(建议都加上)
-I[dir]:将dir目录加入搜索头文件的目录路径
-L[dir]:将dir目录加入搜索库的目录路径
-l[lib]:链接lib库
-g:在目标文件中嵌入调试信息,以便gdb之类的调试程序调试

下面看gcc模拟编译的几个步骤

#hello.c文件内容
#include <stdio.h>
#define HELLO "hello!!\n"

int main(void)
{
        printf(HELLO);
        return 0;
}
#预编译,之后查看hello.i文件可查看到宏展开、头文件展开等
gcc -E hello.c -o hello.i 
#编译,查看hello.s是个汇编文件
gcc -S hello.i -o hello.s
#汇编
gcc -c hello.s -o hello.o
#链接
gcc hello.o -o hello

#上诉过程可以一次性完成,(编译生成可重定位目标文件)
gcc -c hello.c或gcc -c hello.c -o hello.o

gcc编译多文件

#hello_fn.h是声明,hello_fn.c是函数内容,main.c主函数
#一次性生成
gcc  hello_fn.c main.c –o newhello

#独立编译,将每个.c文件生成.o文件,再将每个.o文件链接成可执行文件
#独立编译的好处:哪一个模块出问题了,就只需要编译这个模块就好,不需要全部编译,这样会节省时间
gcc -Wall -c main.c -o main.o
gcc -Wall -c hello_fn.c -o hello_fn.o
gcc -Wall main.o hello_fn.o -o newhello

使用外部库

常用头文件和库的位置

/usr/include及其子目录底下的include文件夹
/usr/local/include及其子目录底下的include文件夹
/usr/lib
/usr/local/lib

先看一个例子,程序如下

#include <math.h>
#include <stdio.h>

int main(void)
{
    double x = pow(2.0, 3.0);
    printf("The cubed is %f\n", x);
    return 0;
}
#-lm表示要链接libm.so或者libm.a库文件
gcc -Wall calc.c -o calc -lm

静态库和动态库

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库;动态库(.so或.sa):程序在运行的时候才去链接共享库的代码,多个程序共享使用库的代码。

以下为动态库的运行原理:
一个与共享库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码;在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该共享库中复制到内存中,这个过程称为动态链接(dynamic linking);共享库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份共享库被要用到该库的所有进程共用,节省了内存和磁盘空间。

生成静态库

现在将hello_fn.c模块生成库,库可以认为是个归档文件,将.o文件打包生成库。
见以下说明

#先生成.o文件,别忘了-c,若不加-c就是生成可执行文件了
gcc -Wall -c hello_fn.c -o hello_fn.o
#ar是归档文件,rcs(replace and create)
ar rcs libhello.a hello_fn.o 
#两种方式使用libhello.a
(1)
gcc -Wall main.c libhello.a -o main
(2)
#或(注意提示错误,因为默认情况下不会在当前目录下查找库)
gcc -Wall main.c -o main -lhello
#正确(-L.表示库文件的位置在这地下,否则在系统的目录下搜索)
gcc -Wall -L. main.c -o main -lhello
#说明下,这时生成main可执行程序后,若删掉libhello.a静态库后,也不会影响,因为静态库是链接到可执行文件中了

库路径搜索

按顺序来:
1. 从左到右搜索-I(指定头文件的目录) -L指定的目录(指定库的目录)
2. 由环境变量指定的目录(环境变量可在~/.bash_profile(对当前用户生效)下设置LIBRARY_PATH(静态库路径)或C_INCLUDE_PATH(c头文件),CPLUS_INCLUDE_PATH(c++头文件)),或/etc/profile(对所有用户生效)
3. 由系统指定的目录

生成动态库

shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)
(解释下:允许它在任何位置加载)
库名规则:libxxx.so

gcc -shared -fPIC hello.o –o libhello.so

使用共享库
编译选项
l:链接共享库,只要库名即可(去掉lib以及版本号)
L:链接库所在的路径.
示例:

gcc main.o -o main –L. -lhello

如何解决经常找不到库的问题共享库运行时需要的设置
1. 拷贝.so文件到系统共享库路径下
一般指/usr/lib
2. 更改LD_LIBRARY_PATH(动态库),LIBRARY_PATH(静态库) (在配置文件~/.bash_profile下(当前用户下) )
3. ldconfig(全局的)
配置ld.so.conf(/etc/ld.so.conf下配置库),之后再调用ldconfig更新ld.so.cache即可

可以用ldd main(可执行程序名)查看链接的库

GCC命令与参数详解 使用 GCC 需要对编译的四个阶段(编译过程),以及编译的规则有一定的了解,熟悉使用 GCC 对于编写 Makefile 具有决定性的作用。GCC 的命令使用非常灵活,命令都以 gcc 开头然后配合待编译文件名,编译选项即可(可以说 GCC 就只有一条命令,只是编译选项较多而已)。命令选项可以随意组合,只需要注意选项是否包含参数即可,如果选项包含参数则参数需要紧紧跟随在选项后方。 阅读详情

相关推荐

Linux下的GCC入门介绍及简单示例

本文简单介绍的GCC编译器的来源和使用方法,并给出了一个简单的GCC实验例子。

qq_17691347的博客 935

GCC的基本用法

GCC的基本用法

小原的博客 8318

简单快速了解gcc(新手入门)

gcc简介 gcc工作步骤 gcc语法 gcc常用选项 多源文件编译方法刚安装上Linux系统,安好Vim的时候,还不知道该怎么用它,后来基本上用的很多的就是 vim xxx.c、gcc xxx.c、./aout三步走,gcc的选项很多,全部记住会很难,所以我挑出来一些常用的选项,把这些整理下来(其实这些应该是早早就应该了解的,一直拖到现在,实在不应该)1.gcc简介gcc命令使用GNU推出的基于C

FallingU的博客 1516

Linux:gcc工具

Linux下的gcc工具的使用和一些关于库的知识讲解

weixin_57418095的博客 3964

Android 导出aar 用于Unity 百度语音唤醒

AndroidStudio版本下载地址Android Studio Arctic Fox Unity版本2021.3.26f1c1 新建AndroidStudio工程 新建module 这里注意一下,网上很多教程说要注意包名要和unity一样,但是测试下来,不一样也可以的 在新建的module里添加这两个jar包,并点击右键add as library 导入jniLibs 右键创建这几个package 代码就安装这个大佬的写参考代码 需要注意的的是在WakeupListener脚本里U

weixin_38777563的博客 633

使用下一代的嵌入式IDE-PlatformIO 教程

1.生成工程 1.1 打开STM32CubeMX: 选择你的MCU,这里我用的是STM32F103RC RCC中开启外部HSE时钟,外部时钟比HSI更稳定些 开启DEBUG 4线 打开串口1用于打印调试信息,波特率115200,校验位0,停止位1 打开串口2用于MODBUS协议,波特率9600,校验位0,停止位1 接入RT-thread:参考官方文档 基于 CubeMX 移植 RT-Thread Nano 根据官方文档,需要1.取消生成HardFault_Handler、PendSV_Handler、Sy

jiladahe1997的博客 3万+

【Linux】gcc -o 什么意思

+ gcc gcc 命令:用来编译C和C++文件-c 编译、汇编而不链接 -S 编译而不进行汇编和链接 -E 预处理 -v 同时显示编译器的代码 -o<文件> 将输出输入到指定文件 -x<语言> 指定语言 --help 显示帮助信息 --version 显示版本信息 # hello_world.c文件内容是 vim hello_world.c #按i ,进入输入模式 #include int main () { printf(“Hello World “); retu

zcw1234515的博客 1万+

计算蛋白质结构中氨基酸之间的方向和方位

方向 (Direction):通过相邻氨基酸的 CαCα​ 原子坐标差值,得到方向向量,描述两个氨基酸之间的几何方向。方位 (Orientation):可以通过二面角(如 Psi)来表示相邻氨基酸之间的旋转关系,或者通过局部坐标系(基于 NN、CαCα​、CC 原子)描述残基的空间取向。这些计算是研究蛋白质结构动力学、折叠过程、以及相互作用的基础,尤其是在使用机器学习和深度学习模型进行蛋白质结构预测时,这些几何信息有助于更好地捕捉残基之间的空间关系。

qq_27390023的博客 1679

GCC简单入门

导语 GCC是GNU Compiler Collection的缩写,包含gcc、g++等编译工具。这个工具不仅包含编译器,还包含其他工具集,例如ar、nm等。今天简单的讲一讲这个工具。 简介 GCC能编译C、C++、Objective-C、Fortran、Java、Ada等语言。GCC可以在不同的硬件平台编译,即支持交叉编译。 GCC的c编译器是gcc,其命令格式为 Usage:gcc [options] file... GCC支持默认拓展名策略,下表是GCC下默认文件拓展名的含义。 GCC常用的编译

bbszhenshuai的博客 3002

改进爬山算法之六:随机重启爬山算法(Random-Restart Hill Climbing,RRHC)

随机重启爬山算法(Random-Restart Hill Climbing,RRHC)是爬山算法的一种改进策略,是一种启发式搜索算法,旨在通过随机重启来克服传统爬山算法容易陷入局部最优解的局限性,并增加找到全局最优解的概率。随机重启爬山算法通过在多次运行中不断尝试不同的初始解,并在每次运行中执行标准的爬山算法,最终选择所有运行中找到的最佳解作为最终结果。(1)计算复杂度:由于需要多次运行爬山算法,因此算法的计算复杂度可能较高,特别是在解空间较大或每次迭代需要较长时间的情况下。

搏博的专栏 2204

2026最新openclaw(clawbot/moltbot)真正在自己个人电脑上搭建部署,配置飞书远程远程让AI助理操控电脑完成任务,以及结合ollama无限token实现7*24小时工作(附配置)

2026最新openclaw(clawbot/moltbot)真正在自己个人电脑上搭建部署,配置飞书远程远程让AI助理操控电脑完成任务,以及结合 ollama 无限token实现7*24小时工作,以及部署安装需要的 skills 完成复杂的工作任务(附完整可以运行的配置文件)。 很多人已经会配置安装 openclaw 了 ,但是 安装完成之后真正让电脑自动运行起来的很好,完成出色工作的更少,最常见的就是聊聊天,或者执行一些简单的命令,理解要让电脑自动化工作,openclaw、skills、大模型这三样。

代码讲故事 2962

objdump和gcc命令简单入门

objdump和gcc命令简单入门前言GCC的使用GCC介绍其他可选参数objdump使用objdump反汇编常用参数objdump使用例子 前言 objdump是用于查看目标文件的命令行工具,常配合另一个命令行工具gcc使用。通过objdump查看汇编代码可以进行一些代码调优,明白实现同一功能的不同代码写法在底层的差异。 GCC的使用 GCC介绍 GCC(GNU Compiler Collection)是由 GNU 开发的编程语言编译器。GCC 编译工具链在编译一个C源文件时需要经过以下 4 步: 预处

superhoner的博客 1116

【学习系列】SAP RAP 16:RAP应用部署集成至Fiori Launchpad 【On-Premise】

本文详细介绍了如何将开发完成的RAP应用部署到S4HANA 2023 On-Premise环境并集成到Fiori Launchpad的完整流程。主要内容包括:1)通过ADT工具创建Fiori项目并配置外部IDE(VSCode);2)使用npm命令部署应用到系统;3)通过事务代码创建语义对象、磁贴目录和目标映射;4)配置PFCG角色分配;5)补充了部署失败解决方案、翻译问题处理、自定义主题设置以及登录页面LOGO修改等内容。文章提供了step-by-step的操作指南,帮助开发者将预览模式的应用正式部署到生产

DeveloperMrMeng的博客 632

gcc编译简单入门

gcc编译简单入门

anonfish的博客 264

使用蒙特卡洛模拟方法在MATLAB中估算居里温度: 一个详细而通俗的指南

居里温度是磁性材料失去磁性的温度。但是,计算机模拟为我们提供了一个在理论和实验之间的桥梁,使我们能够在不进行实际测量的情况下估计这一重要参数。在下一部分,我们将详细介绍蒙特卡洛迭代的核心代码,以及如何使用它来模拟磁性材料中原子的行为。在估算居里温度的上下文中,我们将使用蒙特卡洛方法来模拟磁性材料中的原子或分子的行为。通过使用蒙特卡洛方法,我们可以在MATLAB中估算居里温度,从而为理论研究和实验设计提供有价值的信息。:我们使用的是一个有限的尺寸的网格模型,这可能导致一些大小效应,特别是在接近居里温度时。

qq_38334677的博客 977

基于STM32+华为云设计的智能鱼缸

本项目基于STM32单片机设计一款基于物联网的智能鱼缸系统,并通过应用侧接口开发上位机APP实现远程对鱼缸参数的检测和控制。该系统包括水温检测、水质检测、自动或手动换水、氛围灯灯光变换和自动或手动喂食等功能,可以帮助用户更好地管理鱼缸,提高鱼儿的生存率,同时增强用户对家庭装饰品的掌控感和科技感。

1万+

gcc 与 Makelfile 简单入门

gcc 与 Makelfile 简单入门准备工作注意:本文可能会让你失望,如果你有下列疑问的话:为什么要在终端输命令啊? GCC 是什么东西,怎么在菜单中找不到? GCC不能有像 VC 那样的窗口吗?…… 那么你真正想要了解的可能是 anjuta,kdevelop,geany,codeblocks,eclipse,neatbean 等IDE 集成开发

379

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Vim 简单配置 与 GCC/G++ 初步入门:新手也能轻松上手

本文系统介绍了Linux下Vim编辑器和GCC/G++编译器的使用技巧。主要内容包括:1) Vim的替换模式(R/r)和视图模式(ctrl+v)的高效操作;2) 底行模式的分屏对比(vs)和关键词搜索替换方法;3) Vim配置原理(.vimrc文件)和一键化配置方案;4) GCC编译过程的四个阶段(预处理、编译、汇编、链接)及对应指令。文章通过实例演示了批量化注释、异常处理等实用技巧,帮助开发者快速掌握这些基础工具,提高编码效率。适合Linux/macOS下的C/C++开发者阅读学习。

心向往之,行必能至 1803

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Linux GCC/G++编译器与调试器简单的入门教程

  GCC能编译C、C++、Ada、Object C和Java等语言,G++则专门用来编译C和C++语言的编译器。为保持兼容程序语言的最新特性,开发者通常选择GCC来编译C语言编写的源代码,选择G++来编译C++源代码。 1、Linux GCC/G++编译器的安装 yum -y install make #安装make程序 yum -y install gcc #安装GCC...

小灯数据 513

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

linux中使用gcc编译的简单指令和makefile编写的入门级规则

使用gcc进行编译链接 #仅仅将源码编译成目标文件,不进行链接 gcc -c hello.c #生成hello.o文件,不会生成可执行文件 #加入编译优化 gcc -O hello.c -c #生成hello.o文件,不会生成可执行文件 #编译链接生成可执行文件 gcc hello.c -lm -L/usr/bin -I/usr/include #生成可执行文件a.out #-lm 表示libm.so或libm.a 函数库文件 #-L 后面接的是指定.

DongZhaoCheng 939

linux下gcc编写java,linux 下c语言编程 GCC使用入门

本文来自:ubuntu中文论坛本文是写给 gcc 新手的入门文章,所以内容比较简单。如果你知道下面3条命令都可以编译c++的话,就不用在本文浪费时间了 代码:g++ -Wall hellocpp.cppgcc -Wall hellocpp.cpp -lstdc++gfortran -Wall hellocpp.cpp -lstdc++http://wiki.ubuntu.org.cn/C_Cpp_...

weixin_34619335的博客 232

linux编译调试教程,Linux GCC/G++编译器与调试器简单的入门教程

GCC能编译C、C++、Ada、Object C和Java等语言,G++则专门用来编译C和C++语言的编译器。为保持兼容程序语言的最新特性,开发者通常选择GCC来编译C语言编写的源代码,选择G++来编译C++源代码。1、Linux GCC/G++编译器的安装yum -y install make #安装make程序yum -y install gcc #安装GCC编译器yum -...

weixin_36174545的博客 237

GCC 新手入门

 本文是写给 gcc 新手的入门文章,所以内容比较简单。如果你知道下面3条命令都可以编译c++的话,就不用在本文浪费时间了 代码:g++ -Wall hellocpp.cppgcc -Wall hellocpp.cpp -lstdc++gfortran -Wall hellocpp.cpp -lstdc++注:本文最新版在wiki中 http://wiki.ubuntu.org.cn/G

javazat的专栏 451

[C++]GCC的C++入门(2012-10-28更新)

本文的入门是指GCC的入门,而不是计算机科学的入门,一些概念是不解释的,比如什么是汇编啊之类的。还有本文几乎只涉及GCC对于C++的支持 1. 写在前边 首先给出一个gcc最简单的用法: 编写源文件 test.cpp,然后使用命令 $gcc test.cpp ,gcc将生成 a.out 程序文件,使用命令 $./a.out ,执行编译好的可执行程序 GCC以前是指GNU C Com...

weixin_30600503的博客 156

【linux 下C语言环境搭建】GCC安装和make安装

Linux下使用最广泛的C/C++编译器是GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是初学者,一般都将GCC作为Linux下首选的编译工具。本教程毫不犹豫地使用GCC来编译C程序。 首先检查系统是否安装GCC 以及make gcc -v make -v 运行结果如下: (base) [root@laishui-ai sinoma]# gcc -v -bash: gcc: command not found (base) [root@laishui-ai sinoma]# make -v

赖德发的博客 9128
上一篇: UNIX环境编程之<二>文件共享I/O操作dup,fcntl函数
下一篇: Linux之文件压缩gzip,bzip,tar等
黑帽子和猫
博客等级 码龄12年 41粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值