一个不完全编译导致的奇怪问题

1. 初始代码

文件a.h:

typedef struct
{
    int a;
    int b;
} a_t;

void set_a(a_t *in, a_t *out);

a.c:

#include "a.h"

void set_a(a_t *in, a_t *out)
{
    out->a = in->a;
    out->b = in->b;
}

main.c:

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

int main()
{
    a_t in;
    in.a = 1;
    in.b = 2;

    a_t out;
    set_a(&in, &out);

    printf("%d-%d\n", out.a, out.b);
    return 0;
}

makefile:

all: a.o main.c
	gcc -g a.o main.c

a.o: a.c
	gcc -g -c a.c -o a.o

编译运行,生成a.o, a.out, 运行a.out 输出: 1-2

2. 修改代码

a.h 

typedef struct
{
    int a;
    int b;
    int c;  //new add
} a_t;

void set_a(a_t *in, a_t *out);

a.c:

#include "a.h"

void set_a(a_t *in, a_t *out)
{
    out->a = in->a;
    out->b = in->b;
    out->c = in->c;  // new add
}

main.c:

#include "a.h"
#include <stdio.h>
int main()
{
    a_t in;
    in.a = 1;
    in.b = 2;
    in.c = 3;   // new add

    a_t out;
    set_a(&in, &out);

    printf("%d-%d-%d\n", out.a, out.b, out.c); //modified
    return 0;
}

奇怪现象

运行编译,输入如下:1-2-0,是不是感觉很奇怪, 我们期望的是1-2-3

3. 分析问题

gdb 调试,发现a_t结构体的大小在main.c 和 a.c中的size 不一致,一个是12bytes, 一个是8bytes.

分析到这里,你应该明白问题所在了吧,就是a.h修改后,a.c没有重新编译生成a.o, a.out可执行文件link的仍然是初始代码的a.o.

如果你想要确保修改了a.h后,所有包含它的.c文件都能重新编译,你需要在每个.c文件的编译规则中显式地列出a.h作为依赖。修改makefile:

all: a.o main.c
	gcc -g a.o main.c

a.o: a.c a.h
	gcc -g -c a.c -o a.o	

以上只是一个示例代码,我在工程中遇到过类似的问题,可执行文件ut依赖于a.so, ut 和 a.so 都用到公共接口文件interface.h, 同事在修改了interface.h和a.so对应的c代码后,ut中发生不预期的行为,最后分析的原因就是interface.h修改后,a.so没有重新生成,ut 链接时仍然使用的是旧的a.so。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/796499.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排序(三)——归并排序(MergeSort)

欢迎来到繁星的CSDN&#xff0c;本期内容主要包括归并排序(MergeSort)的实现 一、归并排序的主要思路 归并排序和上一期讲的快速排序很像&#xff0c;都利用了分治的思想&#xff0c;将一整个数组拆成一个个小数组&#xff0c;排序完毕后进行再排序&#xff0c;直到整个数组排序…

图解HTTP(5、与 HTTP 协作的 Web 服务器 6、HTTP 首部)

5、与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站&#xff0c;也可作为通信路径上的中转服务器提升传输效率。 用单台虚拟主机实现多个域名 在相同的 IP 地址下&#xff0c;由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站&#xff0c;因此…

阅读笔记——《Fuzz4All: Universal Fuzzing with Large Language Models》

【参考文献】Xia C S, Paltenghi M, Le Tian J, et al. Fuzz4all: Universal fuzzing with large language models[C]//Proceedings of the IEEE/ACM 46th International Conference on Software Engineering. 2024: 1-13.【注】本文仅为作者个人学习笔记&#xff0c;如有冒犯&…

跟着李沐学AI:简单损失函数

均方损失L2Loss 特点&#xff1a;当真实值y与预测值y相差较远时&#xff0c;梯度较大&#xff0c;参数更新较多。当预测值与真实值靠近时&#xff0c;梯度越来越小。 最小绝对值损失L1Loss 特点&#xff1a;当预测值与真实值相差较远时&#xff0c;梯度永远为常数&#xff0c;…

【Golang】map的使用

map声明的方式 //声明var m map[string]string//在使用map之前&#xff0c;先make&#xff0c;make的作用就是给map分配空间m make(map[string]string)m["lover"] "Yzx"m["friend1"] "Zxw"m["friend2"] "Zzc"…

SQL语法精选-如何拼接多列的值?

在做业务数据分析的时候&#xff0c;可能会遇到这样一个场景&#xff0c;需要将多个字段进行拼接&#xff0c;变为一个长字符串 比如年、月、日三个字段拼接成完整的日期&#xff0c;或者姓、名两个字段拼接成姓名列 这就需要用到SQL查询中串联&#xff08;拼接&#xff09;方…

LLM大模型从入门到精通(3)--LLM主流大模型类别

目录 1 ChatGLM-6B模型简介&#xff1a; 2 LLaMA模型简介&#xff1a; 3 BLOOM模型简介 4 Baichuan-7B模型 随着ChatGPT迅速火爆&#xff0c;引发了大模型的时代变革&#xff0c;国内外各大公司也快速跟进生成式AI市场&#xff0c;近百款大模型发布及应用。开源语言大模型种…

分享一个 EF6 分页查询数据的 IQueryable 扩展方法

前言 不废话&#xff0c;直接上方法。_ IQueryable 扩展方法 方法一 /// <summary> /// 由其它 Reponsitory 提供数据源&#xff0c;分页查询数据 /// </summary> /// <typeparam name"T"></typeparam> /// <typeparam name"S&quo…

AI绘画;盘点用stable diffusion 赚钱的10种方式!

前言 stable diffusion 是一种基于文本生成图像的深度学习模型&#xff0c;它可以根据任何文本输入生成逼真的图像。它利用了 CLIP ViT-L/14 文本编码器的文本嵌入和扩散模型的潜在变量&#xff0c;实现了高质量的图像合成。 stable diffusion 可以用于赚钱的10种方式及思路如…

【Django+Vue3项目实战】构建高效线上教育平台之首页模块

文章目录 前言一、导航功能实现a.效果图&#xff1a;b.后端代码c.前端代码 二、轮播图功能实现a.效果图b.后端代码c.前端代码 三、标签栏功能实现a.效果图b.后端代码c.前端代码 四、侧边栏功能实现1.整体效果图2.侧边栏功能实现a.效果图b.后端代码c.前端代码 3.侧边栏展示分类及…

本地部署,去除动漫图像背景Anime Remove Background

目录 摘要 引言 深度学习在动漫角色中的应用 1.​U-Net 2.Mask R-CNN 3.ISNet 模型 4.MODNet 模型 5.InSPyReNet 模型 本地部署 运行效果 测验结果​ Tip&#xff1a; 摘要 动漫图像背景去除是一项在图像处理和计算机视觉领域具有重要应用的技术&#xff0c;广泛应用于…

买不到用户的大模型,开始倒闭了

前段时间各个大模型开始降价甚至免费&#xff0c;都是为了抢夺用户&#xff1b;而随着AI加持&#xff0c;iPhone也要来抢夺用户&#xff1b;这种情况下&#xff0c;没有用户甚至买不到用户的大模型&#xff0c;已经开始倒闭了。 拿到2000万元创业投资的大林&#xff0c;仅过了一…

LeetCode刷题笔记第3011题:判断一个数组是否可以变为有序

LeetCode刷题笔记第3011题&#xff1a;判断一个数组是否可以变为有序 题目&#xff1a; 想法&#xff1a; 使用冒泡排序进行排序&#xff0c;在判断大小条件时加入判断二进制下数位为1的数目是否相同&#xff0c;相同则可以进行互换。最后遍历数组&#xff0c;相邻两两之间是…

创建地形——笔记

1、创建地面 (1) 3D Object-Terrain (2) 导入资源 (3) 选中Terrain&#xff0c;绘制贴图 (4) 新建一个沙土层 (5) 编辑沙土层——选中Inspector中的新建沙土层&#xff0c;出现编辑面板 依次点击Nomal Map和Mask Map右侧的Slect&#xff0c;增加法线贴图&#xff08;紫&…

【Redis】初识 Redis

文章目录 1 什么是 Redis2 Redis 的特点2.1 速度快2.2 可编程性2.3 可拓展性2.4 持久化2.5 主从复制2.5 高可用和分布式2.6 客户端语言多 3 Redis 使用场景3.1 实时数据存储3.2 缓存和 Session 存储3.3 消息队列 4 Redis 重大版本5 CentOS7 安装 Redis5 1 什么是 Redis Redis …

数据库mysql-对数据库和表的DDL命令

文章目录 一、什么是DDL操作二、数据库编码集和数据库校验集三、使用步骤对数据库的增删查改1.创建数据库2.进入数据库3.显示数据库4.修改数据库mysqldump 5.删除数据库 对表的增删查改1.添加/创建表2.插入表内容3.查看表查看所有表查看表结构查看表内容 4.修改表修改表的名字修…

《ElementUI/Plus 基础知识》el-tree 之修改可拖拽节点的高亮背景和线

前言 收到需求&#xff0c;PM 觉得可拖拽节点的高亮背景和线样式不明显&#xff01;CSS 样式得改&#xff01; 注意&#xff1a;下述方式适用于ElementUI el-tree 和 ElementPlus el-tree&#xff01; 修改 拖拽被叠加节点的背景色和文字 关键类名 is-drop-inner .el-tree…

keepalive和haproxy

1、keepalive 1.1概念 调度器的高可用 vip地址主备之间的切换&#xff0c;主在工作时&#xff0c;vip地址只在主上&#xff0c;主停止工作&#xff0c;vip漂移到备服务器 在主备的优先级不变的情况下&#xff0c;主恢复工作&#xff0c;vip会飘回到主服务器 1、配优先级 …

智能优化算法之蚁群算法ACO

蚁群算法&#xff08;Ant Colony Optimization, ACO&#xff09;由意大利学者马尔科多里戈&#xff08;Marco Dorigo&#xff09;于1992年在其博士论文中首次提出。灵感来自于自然界中的蚂蚁群体行为&#xff0c;特别是蚂蚁在寻找食物过程中所展示的路径优化能力。蚁群算法属于…

基于stm32+小程序开发智能家居门禁系统-硬件-软件实现

视频演示&#xff1a; 基于stm32智能家居门禁系统小程序开发项目 视频还有添加删除卡号&#xff0c;添加删除指纹&#xff0c;关闭继电器电源等没有演示。 代码Git&#xff1a; https://github.com/Abear6666/stm32lock 总体功能&#xff1a; 本门禁系统主要解锁功能分别为卡…