C++ -malign-double 编译器标志

Posted

技术标签:

【中文标题】C++ -malign-double 编译器标志【英文标题】:C++ -malign-double compiler flag 【发布时间】:2010-03-16 18:48:16 【问题描述】:

我需要一些关于 c++ 中编译器标志的帮助。我正在使用一个库,它是从 Windows 到 linux 的端口,必须使用 -malign-double 标志编译,“为了 Win32 兼容性”。我的理解是这意味着我绝对必须用这个标志编译我自己的代码?其他 .so 共享库怎么样,是否也使用此标志重新编译了它们?如果是这样,有什么办法可以解决这个问题?

我是一个 linux 新手(和 c++),所以即使我尝试重新编译我用于我的项目的所有库,递归查找所有库的源代码以及它们的库也太复杂了'依赖并重新编译所有内容。

编辑: 感谢您的回答。一些背景知识:该库控制初始化和对 USB 连接相机的访问。问题是如果没有这个标志,奇怪的事情就会开始发生。看似随机,相机的初始化失败,USB连接错误。我还得到了堆栈上的几个 c 字符串(const char *)的某种内存损坏。基本上,在我调用这个相机的初始化之前,它们指向一个目录路径;初始化后,它们指向字符串“me”。这对我来说非常令人困惑。

【问题讨论】:

Martin,听起来你真的需要和图书馆的作者谈谈。 @osgx 的答案是正确的——也许它与库使用的文件格式有关,因为相机可能被视为某种文件系统。但是重新编译所有内容以支持一些设计不佳的文件格式并不是一个好主意。 【参考方案1】:

这是一个伟大的旗帜名称!我想知道是否还有-malign-influence?但说真的,这个标志控制着轻微的优化:

-malign-double

-mno-align-double

控制 GCC 是否对齐 double、long double 和 long 两个字边界上的长变量 或一个单词边界。对齐双精度 两个字边界上的变量将 生成运行速度更快的代码 在“奔腾”上牺牲更多 记忆。

库或您的代码不太可能需要此标志。一般来说,您不应该使用对齐控制标志,除非您确切知道自己在做什么。如果您确实需要使用它们,请参阅http://gcc.gnu.org/onlinedocs 的 GCC 手册。

【讨论】:

【参考方案2】:

您通常不需要更改现代编译器的对齐设置。 即使编译器会存储一些未对齐的东西,程序也不会被破坏。

唯一需要它的地方是在 linux 和 windows 版本的二进制程序之间传递的结构(通过文件或通过网络)。但在这些情况下,pragma pack 的用法更好。

更新:驱动程序还要求二进制结构与规范逐位相等。

【讨论】:

我想可能是这样。该库的生成文件提到了一些关于结构对齐的内容。所以我可以潜在地将这个 pragma pack 指令添加到“需要”对齐的库的每个结构中?由于我使用的是 linux gcc,因此该指令似乎不可用。 @Martin GCC 确实支持打包编译指示 - 请阅读我在回答中提供链接的手册,第 5.53.7 节。这是否能解决你的问题,我不能说。 @Martin,USB 驱动程序确实使用二进制结构。它被用作特殊文件,程序必须为网络摄像头生成位精确的命令。您只需要为该 USB 设备生成位数据的库的对齐文件。【参考方案3】:

可能是这样。如果该代码期望堆栈在入口处对齐,而您的代码不能确保这一点,则存在问题。堆分配的对象也是如此。如果您传递应该对齐但没有对齐的指针,那也是错误的。

同时,可能只有一两个函数需要对齐一些变量,毕竟这从来都不是问题。如果人们有时间理解他们负责的代码,那就太好了,但我想这不是它在现实世界中的工作方式。

【讨论】:

以上是关于C++ -malign-double 编译器标志的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法将 c++ 编译器标志设为默认值

Visual Studio C++ 编译器标志:-Zm200 是啥?

更改 GNU 编译器中的 -g 标志使 C++ 可执行 [重复]

C++ 编译器标志忽略外部库的警告但不包括目录

面向 XP 的 Visual Studio 2013 的 Visual C++ 编译器标志

通过编译器环境变量或 C 和 C++ 中的命令行标志指定库路径?