头文件+源文件、动态库和静态库、宏定义_linux 静态链接库 宏定义-程序员宅基地

技术标签: 计算器与编译器  c++  c语言  

前言

先导问题

  • 如果一个函数在多个文件中同时使用,怎么办?
  • 在程序设计中如何避免重复造轮子?

解决方案

  • 头文件+源文件,将不同文件的函数引用到当前文件;
  • 库文件,通过规范的代码编写成特定的库,以便后续调用;
  • 宏定义,通过文本替换来定义简单的函数或变量。

编译过程

源文件(输入)
预处理
编译
汇编
链接
目标文件(输出)

宏定义

在预处理阶段,是编译器对文本的替换。

对比头文件+源文件与库文件

头文件+源文件

  • 编译前是人类可读的,即源代码;
  • 在编译过程中的使用位置:在编译中使用;
  • 来源:人手动编写的;
  • 文件类型:C++中是.cpp.hpp文件。

库文件

库是一种可执行代码的二进制形式,已经写好、适用成熟、在遵守相关协议下可以复用被操作系统载入内存中执行的代码。

  • 编译后是机器可读的,即二进制文件;
  • 在编译过程中的使用位置:在链接中使用;
  • 来源:人手动编写后经过编译生成的;
  • 文件类型:C++中是.so.ko.a文件。

共同点

  • 虽然没有规定调用库函数必须引用头文件,但一般约定,当调用库函数的时候需要引用接口函数所在的头文件;
  • 一个库文件均有一组头文件与其对应。

链接

在这里插入图片描述
链接过程是将链接控制文件、命令行参数、对象文件与库文件融合的过程。

库文件

库文件分为两种:动态库(共享库)和静态库

动态库

  • 链接的时候不放入库文件,而是运行的过程中通过映射调用;
  • 运行速度慢;
  • 生成的目标文件需要在对应的动态库存在的时候才能运行;
  • 目标文件小;

静态库

  • 链接的时候将.o文件直接放入函数应该在的位置;
  • 运行速度快;
  • 生成一个目标文件;
  • 目标文件大;

Linux下几种库文件

  • .so文件:shared object
    .so文件是用户层的动态链接库,用于用户层的动态链接使用,内核态的代码同样不能直接访问。
  • .ko文件:kernel object
    .ko文件是内核态的动态链接库,用于内核态的动态链接使用,可以用于内核之间的模块相互调用。用户态的代码不可直接调用内核态的代码,但是可以通过其他方式进行通信。
  • .a文件:archive
    .a文件是用于静态链接时,使用的静态库。
  • .o文件:object
    .o文件是编译生成的目标文件,.a文件就是由.o文件打包生成的。

Linux环境中实例

文件名:test.c

#include <stdio.h>

int testfunc(void)
{
    
	puts("I'm so file.");
	return 123;
}

文件名:test.h

#ifndef SO_TEST
#define SO_TEST
int testfunc(void);
#endif

文件名:mytest.c

#include <stdio.h>
#include "test.h"

int main()
{
    
	printf("%d\n", testfunc());
	return 0;
}

在Linux终端中输入

gcc test.c -fPIC -shared -o libtest.so
sudo link libtest.so /usr/lib/libtest.so
gcc mytest.c -L . -l test -o mytest

在这里插入图片描述

说明

  • 默认程序运行的时候会在/usr/lib下寻找库;
  • 一种是通过软链接将库链接到/usr/lib下;
  • 另一种是修改PATH和 LD_LIBRARY_PATH,PATH是命令的环境变量,LD_LIBRARY_PATH是库的环境变量。详见Makefile与bash一文。
  • gcc test.c -fPIC -shared -o libtest.so
    -fPIC:位置无关代码(Position Independent Code, PIC)
    -shared:告诉编译器这是要编译动态链接库
    编译最终的命名规则是以lib开头的,即libxxx.so
  • gcc mytest.c -L . -l test -o mytest
    -L:寻找库的目录,.是当前目录
    -l:(小L)要链接的库
  • 注意与-I的区分,因为很多时候很难分得清大i还是小L(当然还有数字1)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/FishPotatoChen/article/details/124347201

智能推荐

win10微软账号登陆报错:0x80190001解决方案_微软账户登录0x8019001-程序员宅基地

文章浏览阅读3.5w次,点赞19次,收藏18次。win10微软账号登陆报错:0x80190001解决方案_微软账户登录0x8019001

从微软AzureDevOps看实施基于DevOps全流程软件交付-程序员宅基地

文章浏览阅读1.5k次。Azure DevOpsAzure DevOps 汇集人员、流程和技术,实现软件交付自动化,为用户提供持续的价值。借助 Azure DevOps 解决方案,帮助您全流程构建你的软件产品,它使流程和产品更可靠。Azure DevOps帮助你用敏捷工具计划项目;用Git管理你的代码;..._azure devops approve

Typora中使用LaTeX:多行公式左对齐_typora对齐公式-程序员宅基地

文章浏览阅读1.4w次,点赞7次,收藏40次。Typora中使用LaTeX:多行公式左对齐有时候公式太长,用=号对齐很难看(有的公式左边很长,右边很短),此时难免需要进行"公式左对齐"。所需要的环境还是"align"(或者是align*,不带公式编号)。语法如下:\begin{align*}\label{2} & X(0) = x(0)W_{N}^{0\cdot0} + x(1)W_{N}^{0\cdot1} + \cdots + x(N-1)W_{N}^{0\cdot(N-1)}\\ & X(1) = x(0)W_{N}_typora对齐公式

springboot配置文件加载顺序, java启动参数优先级_nacos默认覆盖本地吗-程序员宅基地

文章浏览阅读1k次。(12)、jar包外面的 Profile-specific application properties (application- {profile} .properties和YAML)(13)、jar包内的 Profile-specific application properties (application-{profile}.properties和YAML)(1)、在您的HOME目录设置的Devtools全局属性(~/.spring-boot-devtools.properties)。_nacos默认覆盖本地吗

适合写技术文档的工具_技术文档编写工具-程序员宅基地

文章浏览阅读3.6k次。https://www.showdoc.com.cn/_技术文档编写工具

面向食品领域的命名实体识别技术-程序员宅基地

文章浏览阅读706次,点赞17次,收藏24次。非常感谢您的详细任务描述和要求。作为一位世界级人工智能专家和计算机领域大师,我将以专业的技术语言和深入的见解,为您撰写这篇《面向食品领域的命名实体识别技术》的技术博客文章。面向食品领域的命名实体识别技术作者:禅与计算机程序设计艺术1. 背景介绍食品行业是一

随便推点

百度云虚假下载_虚假新闻:关于公共云的5种常见误解-程序员宅基地

文章浏览阅读212次。百度云虚假下载 In the complex world of IT, there are many misconceptions about migrating to the public cloud. Some of these portray the public cloud as the panacea for every IT issue, whereas others consider..._from diggers to data centres从淘金企业到数据中心

Tesseract图像识别OCR的学习1_tesseract doocr-程序员宅基地

文章浏览阅读1.1k次。领导让做一个识别发票的服务,之前都是写增删改查,完全没接触过图像识别这种高大上的东西,记录一下吧新建一个项目,导入tess4j <dependency> <groupId>net.sourceforge.tess4j</groupId> <artifactId>tess4j&l..._tesseract doocr

不同层级的Android开发者的不同行为,我们该如何进阶和规划?-程序员宅基地

文章浏览阅读874次,点赞11次,收藏14次。首先是一个知识清单:(对于现在的Android及移动互联网来说,我们需要掌握的技术)泛型原理丶反射原理丶Java虚拟机原理丶线程池原理丶注解原理丶注解原理丶序列化Activity知识体系(Activity的生命周期丶Activity的任务栈丶Activity的启动模式丶View源码丶Fragment内核相关丶service原理等)代码框架结构优化(数据结构丶排序算法丶设计模式)APP性能优化(用户体验优化丶适配丶代码调优)热修复丶热升级丶Hook技术丶IOC架构设计。

Pelee: A real-time object detection system on mobile devices-程序员宅基地

文章浏览阅读237次。Pelee: A real-time object detection system on mobile devices属于densenet的变种文章,没有使用可分离卷积,因为可分离卷积不同的框架实现方法不一样。Before first dense blockDynamic Number of channels in Bottleneck layerThe nu..._a real-time object detection system on mobile devices

Hadoop环境搭建(保姆级教学)_hadoop平台搭建步骤-程序员宅基地

文章浏览阅读5.4k次,点赞10次,收藏64次。HADOOP环境搭建过程详解_hadoop平台搭建步骤

ZooKeeper实战之ZkClient客户端实现负载均衡_zookeeper实现负载均衡案例-程序员宅基地

文章浏览阅读1.9k次。声明:此博客为学习笔记,学习自极客学院ZooKeeper相关视频;非常感谢众多大牛们的知识分享。相关概念:负载均衡(相关节点)架构图:说明:每当往集群中新增一个工作服务器时,都会再/server节点下创建一个对应的临时节点,该节点中应含有该服务器 的连接信息以及均衡标识等。当客户端需要连接worker server时,就会先读取/servers节点下的所..._zookeeper实现负载均衡案例