4

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

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

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

4

3 回答 3

4

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

-malign-double

-mno-align-double

控制 GCC 是否在两个字边界或一个字边界上对齐 double、long double 和 long long 变量。在两个字边界上对齐 double 变量将生成在“奔腾”上运行得更快的代码,但会消耗更多内存。

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

于 2010-03-16T19:01:08.760 回答
2

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

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

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

于 2010-03-16T19:02:41.387 回答
0

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

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

于 2010-03-16T19:04:42.197 回答