[问题] include相同.h档 但.h内容不同

楼主: renmax (竹科學友哥)   2020-05-07 19:04:49
开发平台(Platform): (Ex: Win10, Linux, ...)
Linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
Netbeans
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)

问题(Question):
A.c 有include "A.h" 和 "B.h"
B.c 有include "B.h"
分别build出两个lib是A.so和B.so
B.h 有个struct 如下:
typedef struct
{
ULONG ulType;
BYTE baIP[20];
USHORT usPort;
BYTE baID[100];
BYTE baPWD[100];
BYTE baLocalPath[128];
BYTE baFtpPath[128];
BYTE baPrivateKeyPath[300];
BYTE baPublicKeyPath[300];
long lTimeout;
}ftpInfo;
我在B.c 增加上面红字的部分后,重新build出B.so后
就直接丢进去和A.so一起跑 (A.so没重build)
debug发现原本应该在baPrivateKeyPath印出的值
却跑到baPublicKeyPath,而且只有尾数几个字符
我在A.c有sprintf(stInfo.baPrivateKeyPath, "/test/test1/test.key");
照理说有指定塞值到baPrivateKeyPath
会因为改变了struct的内容后 导致值跑掉吗?
麻烦了 谢谢
作者: Lipraxde (Lipraxde)   2020-05-07 20:22:00
A.so 没重新编译,对它来说用的是旧的 struct,里面东西摆放的位置跟新的不同。程式经过编译后,对 struct内的东西的读写是透过固定的 offset 去做的,没在管名称
作者: a58524andy (a58524andy)   2020-05-07 23:39:00
好熟悉的bug 以前写作业被阴过 de了通宵还是炸裂XD最后才从朋友那边猜出解法 你要自己加东西而不重编的话 一个workaround是加在最后面这样才能符合其他人的offset不过不确定这个符不符合标准就是 感觉就不符现在想想应该也是当时那个struct的align下刚好可以让我塞,塞太多应该不管怎样都会炸,因为大小不一样*弄array之类需要算pointer怎么加的时候
作者: fatrabitree (胖兔子)   2020-05-08 00:24:00
google "ABI相容"
作者: eye5002003 (下一夜)   2020-05-08 09:02:00
这就是为什么要尽量隐藏细节,不让header透露太多事而且专案最好是串在一起,编译的时候整个一起处理
作者: ko27tye (好滋好滋)   2020-05-08 21:04:00
解完bug后有空可以查查pimpl idiom

Links booklink

Contact Us: admin [ a t ] ucptt.com