Linux动静态库开发基础:静态库与动态库的编译构建、链接使用及问题排查

Linux动静态库开发基础:静态库与动态库的编译构建、链接使用及问题排查

文 章 目 录

💻作 者 简 介:曾 与 你 一 样 迷 茫,现 以 经 验 助 你 入 门 Linux。
💡个 人 主 页:@笑口常开xpr 的 个 人 主 页
📚系 列 专 栏:Linux 探 索 之 旅:从 命 令 行 到 系 统 内 核
✨代 码 趣 语:静 态 库 是 装 满 工 具 的 箱 子,编 译 时 全 塞 程 序,方 便 但 沉;动 态 库 是 共 享 架,记 位 置,没 工 具 就 卡 壳。
💪代 码 千 行,始 于 坚 持,每 日 敲 码,进 阶 编 程 之 路。
📦gitee 链 接:gitee
在这里插入图片描述


         在 Linux C/C++ 开 发 中,库 是 代 码 复 用 和 工 程 化 的 核 心。不 少 开 发 者 会 遇 到 源 码 泄 露、编 译 “找 不 到 头 文 件 / 库”、动 态 库 运 行 加 载 失 败 等 问 题,本 质 是 对 库 的 流 程 不 熟 悉。本 文 从 背 景 切 入,先 讲 静 态 库 的 原 理、制 作 与 使 用,再 讲 动 态 库 的 实 战 技 巧,帮 你 掌 握 库 的 全 流 程 应 用。


一、静 态 库

1、背 景

         设 计 一 个 静 态 库 并 将 已 经 写 好 的 代 码 给 别 人 用。有 两 种 方 法:

  1. 把 源 文 件 给 他
  2. 把 源 代 码 打 包 成 库,必 须 提 供 头 文 件。头 文 件 的 本 质 是 库 文 件 的 说 明 书。

libxxx.a - - - 静 态 链 接
libxxx.so - - - 动 态 链 接


2、原 理

在这里插入图片描述

3、静 态 库 的 流 程

(1)编 写 者

  1. 编 写 源 代 码(不 包 括 main 函 数)。

mymath.h

#pragma once #include<stdio.h> extern int myerrno; int add(int x,int y); int sub(int x,int y); int mul(int x,int y); int div(int x,int y);

mymath.c

#include"mymath.h" int myerrno =0; int add(int x,int y){ return x + y;} int sub(int x,int y){ return x - y;} int mul(int x,int y){ return x * y;} int div(int x,int y){ if(y ==0){  myerrno =1;return-1;}return x / y;}

makefile

Read more

【C++】 —— 笔试刷题day_23

【C++】 —— 笔试刷题day_23

一、 打怪 题目解析 我们现在要去刷毛球怪,我的攻击和血量是h和a、毛球怪的攻击和血量是H和A; 我们和毛球怪的对决是轮流攻击(我们先手),当血量小于等于0时死亡; 现在我们要求在自己存活的条件下,最多能够杀死几只毛球怪;最后输出这个数量。 注意:如果能够杀死无数只怪物,就输出-1 算法思路 对于这道题,首先我们想到的可能就是模拟整个打怪过程,然后记录杀死怪物的数量。 而对于模拟整个过程,程序运行的时间也太长了;而且如果我们能够杀死无数只怪物,那我们要一直模拟整个过程;那也太麻烦了 有没有更加简单的方法? 这道题我们每一个怪物的血量和攻击都是固定的,那我们能不能求出来我们杀死一只怪物所受到的伤害,在根据我们自身的血量,不就可以直接计算出我们能够杀死多少只怪物吗? 所以我们的思路就是先求出来我们杀死一只怪物要攻击多少次,再求出自己所受到的伤害,最后直接计算出能够杀死怪物的数量。计算杀死一只怪要攻击多少次:m = H/a + (H%a == 0?0:1);我们要受到多少次攻击:n = m-1;(我们先手,所以我们受到攻击的次数比我们攻击的次数少一)我们杀死一只怪要

By Ne0inhk
C++ 函数重载:规则、实现与实战案例

C++ 函数重载:规则、实现与实战案例

C++ 函数重载:规则、实现与实战案例 💡 学习目标:掌握函数重载的核心规则,能够熟练实现重载函数,并解决实际开发中重载相关的常见问题。 💡 学习重点:函数重载的匹配原则、与默认参数的冲突处理、实战场景中的重载应用。 一、函数重载的定义与核心价值 ✅ 结论:函数重载是 C++ 多态性的基础体现,允许同一作用域内定义多个同名函数,通过参数列表的差异区分调用。 函数重载的核心价值在于: 1. 简化函数命名,避免为功能相似的函数创建不同名称,提升代码可读性 2. 适配不同类型或数量的参数输入,让函数调用更灵活 ⚠️ 注意事项:函数返回值不能作为区分重载函数的依据。 例如以下代码是非法的: #include<iostream>usingnamespace std;// 非法重载:仅返回值不同intadd(int a,int b){return a + b;}doubleadd(int a,int

By Ne0inhk

C++分支结构完全指南:从条件判断到高效代码设计

编程的本质是决策,而分支结构正是C++程序中实现决策的核心工具。 在程序设计世界中,我们常常需要根据不同的条件执行不同的操作。比如,判断用户输入是否有效、根据成绩划分等级、或者根据用户选择执行不同功能。C++分支结构让程序具备了"智能决策"的能力,使程序能够灵活应对各种情况。 1. 分支结构基础概念 分支结构的核心在于根据条件表达式的真假,决定程序执行的路径。在C++中,条件表达式的结果是一个布尔值(true或false),当表达式为true时,执行对应的代码块;为false时,则跳过该代码块或执行备用代码块。 1.1 为什么需要分支结构 没有分支结构的程序只能是简单的顺序执行,无法应对现实世界中的复杂场景。分支结构为程序带来了: * 决策能力:根据不同条件执行不同操作 * 错误处理:检测并处理异常情况 * 用户交互:响应不同的用户输入和选择 * 流程控制:指导程序执行流程 2. if语句:最基本的分支结构 2.1 单分支if语句 单分支if语句是C++中最基本的分支结构,

By Ne0inhk
C++11 面试题插入(左值引用和右值引用的区别)移动构造和移动赋值C++新标准如何解决传值返回但对象销毁问题

C++11 面试题插入(左值引用和右值引用的区别)移动构造和移动赋值C++新标准如何解决传值返回但对象销毁问题

🎬 胖咕噜的稞达鸭:个人主页 🔥 个人专栏: 《数据结构》《C++初阶高阶》《算法入门》 ⛺️技术的杠杆,撬动整个世界! 列表初始化 1. 内置类型初始化 int x{2};int x1=2; 3. 自定义类型初始化 * 2.1 直接构造 本质是先构造一个Date临时对象, 再拷贝构造d1;但编译器会优化这个过程,直接用列表参数构造d1(即不会调用拷贝构造函数)。 //2.自定义类型(类)的列表初始化// 2.1可以直接构造,本质是先构造一个Date临时对象,// 再拷贝构造d1;但编译器会优化这个过程,直接用列表参数构造d1(即不会调用拷贝构造函数)。 Date d1 ={2025,11,01}; Date d2{2025,05,28}; * 2.

By Ne0inhk