.h头文件和.a静态库文件问题记录

本文探讨了在一个项目中由于Makefile配置错误,导致不同模块编译时使用了不同版本头文件的问题。具体表现为同一结构体在不同静态库中的字段长度不一致,进而引发的运行时错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:

1. ocilib目录中有type.h和ocilib.c,其中type.h中定义了一个结构体field_struct(其中有一个字段val,开始为char[1024],后来被加长为char[2048]),并且在ocilib.c中被使用,ocilib.c和type.h被编译成为静态库文件ocilib.a

2. svrlib目录中有svrlib.c,其中也使用到了type.h的field_struct,但是由于Makefile中链接的INCPATH写错了,指引到了修改之前的type.h(即field_struct中val字段还是为char[1024]),编译生成静态库文件svrlib.a

3. appsvr目录中有appmain.c,其中使用了type.h的field_struct以及ocilib.a和svrlib.a中的函数,链接正确的type.h编译后形成可执行二进制文件appmain


结果:

appmain中使用ocilib.a中的函数时,field_struct.val的长度为2048

appmain中使用svrlib.a中的函数时,field_struct.val的长度为1024


总结:

1. .h的内容在.a被编译生成时被直接使用,编入了.a,不再因后续使用.a时链接的.h变化而变化

2. .h影响且只影响当前编译生成的动态库、静态库、二进制文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值