Linux下C的编译和链接

Linux C程序编译链接的过程,gcc/g++,动态库/静态库 源文件编译链接形成可执行程序的过程,gcc/g++,动态库/静态库 阅读详情
 


1.源程序的编译

/* main.c */
#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}
/* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
/* mytool1.c */

#include "mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %s\n",print_str);
}
/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
/* mytool2.c */
#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s\n",print_str);
}

手动编译:
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o

Makefile SHell 文件编译
  1 #main:main.o mytool1.o mytool2.o
  2 gcc -o main main.o mytool1.o mytool2.o
  3 #main.o:main.c mytool1.h mytool2.h
  4 gcc -c main.c
  5 #mytool1.o:mytool1.c mytool1.h
  6 gcc -c mytool1.c
  7 #mytool2.o:mytool2.c mytool2.h
  8 gcc -c mytool2.c
  9
 10 #格式:第一行表示的是依赖关系,第二行是规则
 11 #比如main:main.o mytool1.o mytool2.o 表示目标main的依赖
 12 #对象是main.o mytool1.o mytool2.o
 13 #Makefile 有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:
 14 #$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.
 15 #简化到Makefile如下:
 16 #  main:main.o mytool1.o mytool2.o
 17 #  gcc -o $@ $^
 18 #  main.o:main.c mytool1.h mytool2.h
 19 #  gcc -c $<
 20 #  mytool1.o:mytool1.c mytool1.h
 21 #  gcc -c $<
 22 #  mytool2.o:mytool2.c mytool2.h
 23 #  gcc -c $<

2.程序库的链接
对于一些常用的函数的实现,gcc
编译器会自动去连接一些常用库,这样我们就没有必要自己去指定了. 有时候我们在编译程
序的时候还要指定库的路径,这个时候我们要用到编译器的 -L 选项指定路径.比如说我们有
一个库在 /home/hoyt/mylib 下,这样我们编译的时候还要加上 -L/home/hoyt/mylib.对于一些
标准库来说,我们没有必要指出路径.只要它们在起缺省库的路径下就可以了.系统的缺省库
的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径.
对于数学库<math.h>引用,程序进行链接的时候用加-lm
gcc -o temp temp.c -lm

3.函数帮助
如果想知道函数的大概形式,用man fread.
当该函数与命令名相同是 用man 2 write 查看函数说明

Linux C高阶(2)linux下程序编译链接过程 动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够按操作系统装入执行的统一整体。了解了这四个过程中所做的工作,对我们理解头文件、库等的工作过程是有帮助的,而且清楚的了解编译链接过程还对我们在编程时定位错误,以及编程时尽量调动编译器的检测错误会有很大的帮助的。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。 阅读详情

相关推荐

Unity游戏开发:从零开始适配Nintendo Switch的完整指南

本文详细介绍了如何使用Unity进行Nintendo Switch游戏开发的完整流程,包括开发环境搭建、Unity工程适配、手柄与硬件特性开发、存储与性能优化等关键步骤。特别强调了Switch SDK的配置、输入系统改造和内存优化技巧,帮助开发者高效完成跨平台适配。

vodka的博客 1067

linux下编译c文件成为可执行文件的实例和详细过程

0、目录 一、准备C文件 二、编译 三、执行 四、编译的四个步骤 一、准备C文件 在命令行模式下输入:vim hello.c 进入编辑模式,输入以下代码: #include<stdio.h> int main(void){ printf("Hello World!\n"); return 0; } 首先点击ESC键退出编辑模式,然后输入:wq(注意...

haovin的博客 7万+

异步FIFO的隐形陷阱:复位信号同步化实战解析

本文深入解析异步FIFO设计中复位信号同步化的隐形陷阱,重点分析赛灵思xpm_fifo_async原语在FPGA应用中的常见问题。通过实战代码和系统集成方案,提供复位同步化的最佳实践,帮助工程师避免跨时钟域通信故障,提升系统可靠性。

keras9composer的博客 244

C语言 | Linux下编译C程序的几种方法

Windows下常用IDE来编译,Linux下直接使用gcc来编译,编译过程是Linux嵌入式编程的基础,也是嵌入式高频基础面试问题。一、命令行编译及各个细分编译过程hello.c示例代...

嵌入式大杂烩 3万+

鼎阳示波器SCPI指令与MD5算法解锁带宽升级实战

本文详细介绍了鼎阳示波器通过SCPI指令与MD5算法实现带宽升级的实战流程。从设备连接、信息获取到Python密钥生成脚本解析,逐步指导用户完成升级操作,并涵盖常见问题排查与功能选件激活指南,帮助用户充分释放设备潜能。

www00的博客 343

RPCA模型及GoDec算法

一、基础知识 在线性代数中,秩的物理意义是矩阵中最大的不相关的向量个数,因此秩可以用来度量相关性;而在图像处理中,秩就可以理解为图像中所包含的信息的丰富程度。图片中比较突兀的成分,会增加图像矩阵的秩,一幅清晰的自然图像其数据矩阵往往是低秩或者近似低秩的,这是因为其中的图像信息有很大的相关性,但如果图像中引入噪声,那么存在随机幅值任意大但是分布稀疏的误差破坏了原有数据的低秩性。 低秩矩阵:如果AAA是一个m×nm×nm×n的矩阵,rank(A)rank(A)rank(A)是矩阵AAA的秩,如果rank(A)

小席的学习日志 7687

Linux上C语言程序编译过程详解

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删本文将介绍如何将高层的C/C++语言编写的程序转换成为处理器能够执行的二进制代码的过程,包括四个步骤:预处理(Preprocessing)编译(Compilation)汇编(Assembly)链接(Linking)GCC 工具链介绍通常所说的GCC是GUN Compiler Collection的...

轻松学C语言 3903

如何在 Windows 中实时打开字幕

在 Windows 操作系统中,你可以使用编程来实现实时字幕功能,以便在屏幕上显示即时的文字内容。下面是一个示例代码,展示了如何使用Python编程语言在Windows上实现实时字幕功能。这样,字幕窗口将会不断地显示系统当前时间作为字幕。你可以根据自己的需求修改主循环中的内容,以显示你想要的实时字幕。希望以上代码和说明能够帮助你在Windows中实现实时字幕功能。函数创建了一个顶级窗口,并设置窗口的样式、位置和大小。方法,用于在字幕窗口中显示指定的字幕内容。上述代码中,我们使用了Python的。

DevWizard的博客 3270

Linux-C C语言编译过程

Linux-C C语言编译过程 一、简述 GCC(GNUCompilerCollection,即GNU编译器套装),是一套由GNU开发的编程 语言编译器。简单介绍使用gcc编译器将hello.c文件编译成为hello可执行文件的过程。 在伪终端下输入如下命令 Liang@ubuntu:~$ gcc hello.c -ohello (这个命令包括了编译的四个阶段:预处理、编译、汇编、链接) 含义:用gcc这个工具编译hello.c,并生成一个二进制...

建建的博客 617

PyTorch深度学习实战(1)——神经网络与模型训练过程详解

在本节中,我们将了解传统机器学习与人工神经网络间的差异,并了解如何在实现前向传播之前连接网络的各个层,以计算与网络当前权重对应的损失值;实现反向传播以优化权重达到最小化损失值的目标。并将实现网络的所有关键组成——前向传播、激活函数、损失函数、链式法则和梯度下降,从零开始构建并训练了一个简单的神经网络。

盼小辉丶的博客 9万+

Modis数据处理工具:MRT百度网盘下载和手把手图文安装教程

如下图所示为MODIS Reprojection Tool(MRT)的软界面,看似简单,却是Modis遥感影像必不可少的处理工具,如投影变换等。本文以图文并茂的形式,详细讲解MRT软件在Windows10平台上的安装过程,并附MRT软件百度网盘下载地址。 Modis Tool主界面: 一、安装过程 1、安装Java运行环境 双击Java.exe,安装运行环境。默认的安装路径为C:\Program Files (x86)\Java\jre6\bin,后面需要用到这个路径。 等待...

智慧空间实验室 2622

LINUX 实现c语言编译程序

Linux是一个开源、免费、稳定、高效的操作系统,它提供了丰富的开发工具和库函数,为C语言编程提供了强大的支持。在Linux环境下,我可以方便地使用GCC编译器、GDB调试器等工具来编译和调试C程序,这大大提高了编程效率。在实验过程中,我不断尝试新的语法和编程方法,逐渐掌握了C语言的基本语法、数据类型、函数、指针等核心概念。在编写代码时,我经常遇到语法错误、逻辑错误等问题,需要不断调试和修改才能得到正确的结果。首先尝试创建一个文件:打开Linux终端,在终端中输入命令创建一个以个人昵称命名的目录,输入“

NTMIAOD的博客 3444

从技术债红线到系统治理:透视 SAP Clean Core 中的 Level D

SAP推出的Clean Core分级体系将扩展风险划分为A到D四个等级,其中Level D代表最高风险类别,涉及直接修改标准代码、隐式增强、使用noAPI对象等不被推荐的做法。这些做法虽然短期见效快,但会带来升级冲突、数据完整性风险等长期问题。SAP强调治理重点不是完全消除经典ABAP,而是优先清理Level D对象,逐步向稳定接口迁移。典型案例显示,依赖内部细节的扩展往往在系统升级或云迁移时集中暴露出问题。企业应通过工具链持续监控Level D占比,将其纳入技术债管理范畴。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1063

linux下C程序的编译链接

linux下C程序的编译可以分为四个步骤,分别是预处理,编译,汇编和链接。 1.预编译: 首先预处理完成预替换、去注释、头文件按照路径展开、以及条件编译。 建立一个test.c文件。里面写入注释、宏定义、头文件、条件编译。 如下图: 使用的gcc命令是:gcc -E test.c -o test.i  gcc -E的作用是将.c文件转化成.i文件 使用vi命令

stupidzx的博客 4042

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Linux下C语言多文件链接编译命令

假设有其中main函数调用的add、sub函数分别包含在以及包含两个函数声明的头文件。

weixin_46163444的博客 690

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C语言 gcc编译和链接(linux)

对于编译型语言,绕不过的就是编译器。-fPIC:由于动态库在内存中是可加载的,它可能在内存中的任意位置,也可能被映射到进程地址空间的每个区域,所以为了保证库当中的代码执行不会出错,也就是要保证库中的代码是与位置无关的,因此生成.o文件时需要带上-fPIC选项表示生成与位置无关码。可知,头文件的作用是编译时提供 main() 方法打包成可执行程序需要链接库是告知库中拥有那些方法的,通常情况下每个.c 文件应该拥有自己的头文件,将方法暴露出来,头文件写法同head(仅包含自身源文件.c)的方法声明,如下图。

2503_90546697的博客 957

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Linux下C语言程序编写及执行和分步骤编译链接C源代码

计算机基础实验报告

m0_63845261的博客 5582

linux c、c++的编译链接运行

GCCLinux下使用最广泛的C/C++编译器是GCC,大多数的Linux发行版本都默认安装,不管是开发人员还是初学者,一般都将GCC作为Linux下首选的编译工具。本教程毫不犹豫地使用GCC来编译C程序。保存文件后退出,打开终端并 cd 到当前目录,输入下面的命令: gcc test.c -o test 可以直接将C代码编译链接为可执行文件。可以看到在当前目录下多出一个文件 test,

最爱山间那朵云 910

linux怎么编译动态链接库,linux 编译c程序与动态链接库

linux 下编译c程序与动态链接库1 动态库h文件和c文件1.1 h 文件: kaflog4c.h/*** kaflog4c.h*/#include #include void hello(const char *msg);1.2 c 文件: kaflog4c.c/*** kaflog4c.c*/#include "kaflog4c.h"void hello(const char *msg){p...

weixin_36302268的博客 881

linux进行c/cpp预处理、编译、汇编、链接的过程与命令

在Linux系统中,使用C语言编写程序后,通常需要经过预处理、编译、汇编和链接等步骤,才能生成可执行文件。预处理是编译过程的第一步,它主要处理源代码中的预处理器指令,例如#include#define等。预处理器会展开所有的宏定义,处理所有的条件编译指令,并包含所有的头文件。这条命令会将hello.c文件预处理后的结果输出到hello.i文件中。编译是将预处理后的文件(.i文件)转换成汇编语言文件(.s文件)的过程。在这个过程中,编译器会检查语法错误,并进行一些优化。这条命令会将hello.i。

m0_57959632的博客 1274

linux 编译链接过程,C语言程序的编译、链接具体过程及Linux环境下的具体实例

c语言程序的编译、链接具体过程及linux环境下的具体实例:我们知道一个程序从编写完成到生成可执行文件分为预处理、编译、汇编、链接,最后再生成可执行文件。预处理阶段,预处理器主要做四部分工作,分别是:头文件展开、宏替换、去注释以及条件编译。(1)头文件展开就是编译器会根据字符#开头的命令去读取相应的文件或者自定义文件, 并把相应的文件直接插入到当前程序代码中,这就完成了头文件的展开。(2)宏替换就...

weixin_39639919的博客 137

Linux C/C++ 编译链接动态库详解

在 Linux C 编译时链接动态库,需要使用 -l 参数指定要链接的动态库名称,同时需要指定动态库的搜索路径。这样就会链接 libtest1.so 和 libtest2.so 两个动态库。这样就会在 /opt/mylib 目录下搜索 libtest.so 动态库。其中,-L 参数指定动态库的搜索路径,-l 参数指定要链接的动态库名称。

Michael 2546

Linux下C/C++程序编译链接加载过程中的常见问题及解决方法

Linux下C/C++程序编译链接加载过程中的常见问题及解决方法 1 头文件包含的问题 报错信息 该错误通常发生在编译时,常见报错信息如下: run.cpp:2:10: fatal error: dlpack/dlpack.h: No such file or directory #include <dlpack/dlpack.h> ^~~~~~~~~~~~~~~~~ compilation terminated. 头文件包含的问题是新手常常会遇到的问题,在这里,我们要先

weixin_44966641的博客 4593

【Linux】Linux使用GCC编译C/C++程序的编译与链接过程

在Linux系统中,编译和链接是将源代码转换为可执行程序的关键步骤。编译器将源代码转换为目标代码,而链接器将目标代码和库文件链接在一起,生成最终的可执行文件。本文将详细介绍Linux中的编译与链接过程,并提供一些实用的示例代码。

科技改变人类,技术成就未来 1219

Linux C程序的预处理、编译、汇编、链接及运行过程

Linux C程序的预处理、编译、汇编、链接及运行过程Hello Word 程序直接编译运行过程预处理编译汇编链接运行 Hello Word 程序直接编译运行过程 在Linux系统下,任意目录内创建一个简单的C程序,命名为hello.c,其代码如下: 1 #include <stdio.h> 2 int main(){ 3 //这里有个注释 4 printf("...

qq_39982235的博客 851
上一篇: 语音识别的基本方法
下一篇: Linux下进程操作
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值