我需要一些关于c ++编译器标志的帮助。我正在使用一个从windows移植到linux的端口库,必须使用-malign-double标志编译,“用于Win32兼容性”。这是我的理解,这意味着我绝对必须用这个标志编译我自己的代码?其他.so共享库怎么样,他们是否也用这个标志重新编译?如果是这样,有什么方法吗?
我是一个Linux新手(和c ++),所以即使我试图重新编译我正在为我的项目使用的所有库,但它太复杂了,无法递归地找到所有库和库的源代码“依赖并重新编译一切。
编辑: 谢谢你的回答。一些背景:该库控制初始化和访问USB连接的摄像头。问题是如果没有这面旗帜,奇怪的事情就会开始发生。看似随机,相机的初始化失败,USB连接错误。我也得到了堆栈上的几个c字符串(const char *)的某种内存损坏。基本上,在我调用这个摄像头的初始化之前,他们指向一个目录路径;初始化后,它们指向字符串“me”。对我来说非常混乱。
答案 0 :(得分:4)
这是一个伟大的国旗名称!我想知道是否还存在一种影响力?但严重的是,这个标志控制了一个小小的优化:
-malign双
-mno-align-double
控制GCC是否对齐double,long double和long 双字边界上的长变量 或一个单词border.Aligning double 两个字边界上的变量将 生成运行速度稍慢的代码 在“奔腾”上牺牲更多 存储器中。
库或您的代码不太可能需要此标志。通常,除非您确切知道自己在做什么,否则不应使用对齐控制标志。如果您确实需要使用它们,请参阅http://gcc.gnu.org/onlinedocs上的GCC手册。
答案 1 :(得分:2)
您通常不需要更改现代编译器的对齐设置。 即使编译器存储了一些未对齐的程序,程序也不会被破坏。
唯一需要它的地方是在linux和windows版本的programm二进制(通过文件或通过网络)之间传递的结构。但在这些情况下,使用pragma pack
是更好的风格。
更新:驱动程序还要求二进制结构与规范逐位相同。
答案 2 :(得分:0)
可能是。如果该代码期望堆栈在条目上对齐,并且您的代码无法确保,则存在问题。堆分配对象也是如此。如果你传递的指针应该是对齐的,但不是,那也是错的。
同时,可能只有一两个函数需要对齐一些变量,毕竟它从来都不是问题。如果给人们理解他们负责的代码所需的时间会很好,但我想这并不是它在现实世界中的运作方式。