[問題] 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