【发布时间】:2021-06-09 14:18:40
【问题描述】:
我目前正在研究一个分为两部分的 Linux x64 gcc 项目:
- 名为 myLib.a 的库
- 一个名为 model.so 的模型链接了之前的库
这两部分不是同时编译的,也不是在同一个环境中编译的(我无法控制 model.so 编译指令)。 由于指针,两者都使用在某些标头中定义的结构共享实例
我的问题是相同的结构定义,比方说
typedef struct {
char var1;
int var2;
} myStruct;
将被隐式编译
#pragma pack(16)
在“模型”环境中,而在“myLib”中它是用隐式编译的
#pragma pack(4)
那么 struct 字段 myStruct.var2 可能不会指向 "myLib" 和 "model" 中的相同内存地址
我不知道如何告诉编译器在每个结构上使用 16 字节对齐(并避免在我的代码中显式编写它)
“myLib”的编译命令如下所示:
g++ -D __x86_64__ -Wall -fpic -c ./libcode.cpp -o ./obj/Release_x64/libcode.o
ar -r -s ./bin/Release_x64/myLib.a ./obj/Release_x64/libcode.o
感谢您的帮助
【问题讨论】:
-
当小结构成员跟随大结构时,可以达到更好的结构布局。你在找stackoverflow.com/questions/14179748/…
-
好吧,我的问题更侧重于如何定义默认对齐值,以便确定编译器在到达没有“#pragma pack”或“属性的结构时会做什么 ((aligned))" 指令
-
这在链接的问题中有所描述。
-
嗯,我非常认真地阅读了整篇文章,我只看到定义了这些属性的情况。我的问题是“我的代码不能包含 #pragma pack 或 attribute,我可以使用编译器标志设置默认对齐行为”。也许答案是否定的