头文件与库文件的区别

2023-05-16

一、头文件与库文件的区别

  • 头文件一般而言,是申明和定义。
  • 库文件是已经编译好的二进制代码。这个二进制代码可以是动态的,如 .so ;也可以是静态的,如 .a 。如果是动态的,则最后生成的程序文件在运行时,需要这个动态库的支持;如果是静态的,则最后生成的可执行程序文件运行时可以脱离这个库文件而独立运行。

头文件以.h结尾,可以用文本编辑器查看内容。是ASCII的。
而库文件以.a(静态库)或.so(动态库)结尾,是二进制的。

二、从几个常遇到的问题谈起

问题一:undefined reference to 'xxx'.

问题二:/usr/bin/ld:cannot find -lxxx.

问题三:xxx.h:No such file or directory.

        首先,这几个问题都不是编译错误,是链接错误,也就是如果出现的是这几个错误,说明你的源程序本身没有问题,是你的编译选项用的不对或者缺少相关的库文件或者头文件。前两个问题是找不到库文件的问题,后一个问题是找不到头文件的问题。下面详细说一下头文件和库文件相关的问题。

三、库文件相关(-l选项和-L选项(大小写L))

        编译完成之后就进入链接阶段,这里就涉及到函数库,比如通常的用的 printf 函数,我们仅仅在程序开始包含进了“stdio.h”,这个里面也只有该函数的声明,而没有定义函数的实现,那么,printf函数的实现在哪里呢?答案是在函数库中,链接时,gcc会链接到具体的函数库中,在那里可以找到printf函数的实现。

        -l 参数就是用来指定程序要链接的库,-l 参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是 m ,他的库文件名是 libm.so,很容易看出,把库文件名的头 lib 和尾 .so 去掉就是库名了。

        好了现在我们知道怎么得到库名了,比如我们自已要用到一个第三方提供的库名字叫libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。

        放在 /lib /usr/lib /usr/local/lib 里的库可直接用 -l 参数就能链接了。但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用 -l 参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld:cannot find -lxxx”,也就是链接程序 ld 在那3个目录里找不到 libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它放在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest

四、头文件相关(-I选项(大写i))

        -I 参数是用来指定头文件目录,/usr/include 目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在 /usr/include 里我们就要用 -I 参数指定了,比如头文件放在 /myinclude 目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。-I 参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。

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

头文件与库文件的区别 的相关文章

  • Hikvison对接NVR实现WEB无插件开发包实现前端视频预览(html、vue、nginx代理)

    场景 Vue中预览HIKVSION海康威视的NVR 网络硬盘录像机 中多个通道 摄像机 的视频 xff1a Vue中预览HIKVSION海康威视的NVR 网络硬盘录像机 中多个通道 摄像机 的视频 霸道流氓气质的博客 CSDN博客 海康nv
  • C++ 为什么编写模板类时要把方法的实现写在头文件中,而不能像写普通类一样写在源文件中?

    1 回答标题的问题 这里说下我自己的理解 xff0c 如有不正确请各位大佬斧正 想要解决这个问题需要先了解C 43 43 代码的编译过程 C 43 43 将代码编译生成可执行文件的过程可以分为三步 xff1a 预编译 编译 链接 预编译时
  • 加速度计、陀螺仪工作原理

    加速度计 陀螺仪的工作原理 参考链接 xff1a https c miaowlabs com B07 html 陀螺仪 加速度计都是惯性测量元件的一种 而 MPU 6050 传感器的内部同时集成了陀螺仪和加速度传感器两种惯性测量元件 1 加
  • VsCode中运行C/C++

    VsCode中运行C C 43 43 1 插件 runCode2 配置环境 mingw64 1 插件 runCode 在 VsCode 中的扩展商店中 xff0c 下载插件 Code Runner 安装完成之后 xff0c 进行一些配置更改
  • 常见通信协议之UART、RS485

    UART 通用异步收发器一种通用的串行 异步通信总线 xff0c 该总线有两条数据线 xff0c 可以实现全双工的发送和接受并行通信和串行通信 总线传递数据的本质 高低电信号并行通信 一次性传输多个位 布线难度高 存在数据干扰串行通信 逐次
  • java的琐碎学习之串口通信与数据库与GUI

    RFID作业 xff0c 要求实现软硬结合 xff0c 全部使用自己的页面完成 xff1b 找了几个教程发现安卓我做不到 xff0c 就用了Java实现 xff1b 图书管理系统 可以通过写卡来绑定15693卡和书籍 xff0c 实现增删改
  • C++- #define 和 const 有什么区别?

    回答如下 xff1a 定义不同 xff1a define 是C 43 43 预处理器的指令 xff0c 用于定义宏 xff0c const是C 43 43 关键字 xff0c 用于定义常量 作用对象不同 xff1a define 定义的宏
  • HTTP协议:二.使用工具观察 HTTP 的请求和响应

    二 使用工具观察 HTTP 的请求和响应 1 HTTP 协议格式 HTTP 是一个文本格式的协议 可以通过 Chrome 开发者工具或者 Fiddler 抓包 分析HTTP 请求 响应的细节 2 抓包工具的下载和使用 直接去官网下载即可 f
  • Linux环境下的c语言编程

    vim编辑器编辑hello c vim编辑器中输入相应代码 编译 运行代码 运行结果 使用GDB函数调用 编译生成可执行文件 启动gdb 第十行设置断点并运行 gcc过程改为makefile管理 编写makefile文件 启动makefil
  • ubuntu下关于ssh远程和scp远程复制文件以及nfs搭建

    SSH远程 在Linux系统中 xff0c 通过客户端连接到远程服务器中 xff0c 方便代码地编写运行 xff0c ssh是一种安全协议 xff0c 主要用于给远程登录信息数据进行加密 1 安装ssh 2 启动ssh 3 创建要发送的文件
  • Linux环境下的多线程&多进程编程

    1 线程的创建与终止 创建一个 c文件 xff0c 使用vi编辑器进行多线程的创建 编译文件 在编译文件时会出现对 pthread create 未定义的引用 xff0c 这是由于pthread 库不是Linux系统默认的库 xff0c 连
  • 东北天坐标系转载体坐标系

    文章目录 1 基本概念1 1欧拉角1 2左乘右乘1 3东北天坐标系1 4载体坐标系1 5捷联惯性导航系统 2 通过ECEF转换到参考点附近的ENU坐标系上3 东北天坐标系到载体坐标系 1 基本概念 1 1欧拉角 欧拉旋转定理指出 xff1a
  • I2C驱动App

    1 查看eeprog c源代码 copyright C by 2009 Guangzhou FriendlyaRM in China email capbily 64 163 com website arm9 net include lt
  • Qt5.14.2 编程应用

    Qt5 14 2 编程应用 什么是Qt Qt 是一个跨平台的 C 43 43 图形用户界面库 xff0c 由挪威 TrollTech 公司于 1995 年底出品 xff0c 并于 2008年6月17日被NOKIA公司收购 xff0c 以增强
  • L298N电机驱动的使用

    L298N电机驱动的使用 前言一 介绍L298N模块简介接口介绍 二 使用步骤硬件连接软件部分1 声明部分2 代码部分 总结 前言 博主为某大学电气专业大学生 xff0c 以学习为目的写下该文 xff0c 内容主要为以51单片机为例简单介绍
  • Authorization头的作用

    Authorization头的主要用作http协议的认证 Authorization的作用是当客户端访问受口令保护时 xff0c 服务器端会发送401状态码和WWW Authenticate响应头 xff0c 要求客户机使用Authoriz
  • vscode中常用的快捷键

    分享一些本人在学习前端过程中用到的一些快捷键 xff0c 需要强调的是 xff0c 这些快捷键适用的软件是VScode 因为自己初学前端用的是这个软件 其中有一些在idea中也是适用的 xff0c 已经在括号内标注 1 alt 43 W 将
  • PID算法原理及基本实现

    自动控制中 xff0c PID及其衍生出来的算法是应用最广的算法之一 各个做自动控制的厂家基本都有会实现这一经典算法 我们在做项目的过程中 xff0c 也时常会遇到类似的需求 xff0c 所以就想实现这一算法以适用于更多的应用场景 1 PI
  • Spring Boot基础学习之(六):前后端交互实现用户登录界面

    本次项目所有能够使用的静态资源可以免费进行下载 静态资源 本篇博客写的内容 xff0c 是一个系列 xff0c 内容都是关于spring boot架构的学习 xff0c 实现前后端交互 xff0c 极大的解放双手spring boot学习系
  • USMART调试组件

    什么是USMART USMART是正点原子团队为其STM32开发平台开发的一种类似linux的shell的调试工具 具体工作过程是通过串口发送命令给单片机 然后单片机收到命令之后调用单片机里面对应的相关函数 并执行 同时支持返回结果 USM

随机推荐