2010-03-16 124 views
4

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

我是一个linux新手(和C++),所以即使我试图重新编译我用于我的项目的所有库,但它太复杂了,无法递归地找到所有库和库的源代码他们依赖并重新编译所有内容。

编辑: 感谢您的答案。一些背景:该库控制初始化并访问USB连接的摄像机。问题是没有这个标志,奇怪的事情开始发生。看似随意,相机初始化失败,USB连接错误。我也得到了一些堆栈上的几个C字符串(const char *)的内存损坏。基本上,在我调用这个摄像头的初始化之前,他们指向一个目录路径;初始化后,他们指向字符串“我”。对我而言,这很混乱。

+0

Martin,听起来你真的需要和图书馆的作者交谈。 @ osgx的答案我是正确的 - 也许它与文件格式的库使用有关,因为相机可能被视为某种文件系统。但重新编译一切以支持一些设计不佳的文件格式并不是一个好主意。 – 2010-03-16 19:22:40

回答

2

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

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

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

+0

我想这可能就是它。该库的makefile提到了一些关于结构对齐的内容。所以我可能会将这个pragma pack指令添加到需要对齐的库的每个结构中?由于我使用的是linux gcc,这个指令似乎并不可用。 – Martin 2010-03-16 19:32:15

+1

@Martin GCC确实支持包装编译指示 - 请阅读我在第5.53.7节中给出链接的手册。不管这个能否解决你的问题,我都不能说。 – 2010-03-16 19:41:51

+0

@Martin,USB驱动程序确实使用二进制结构。它被用作特殊文件,程序必须为网络摄像头生成比特精确的命令。 您确实需要对齐文件仅用于为这个USB设备生成位数据的库。 – osgx 2010-03-17 14:34:22

4

这是一个很棒的国旗!我想知道是否也有一个 - malign影响?但严重的是此标志控制稍有优化:

-malign双

-mno对齐双

控制GCC是否对齐双,长双,和长 长在两个变量字边界 或一个字边界。在两个字边界上对齐双 变量将会产生在'Pentium'上以更快的 以更快的 存储器为代价运行的代码。

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

0

它可能是。如果该代码需要在输入时对齐堆栈,并且代码不能确保,那么存在问题。堆分配对象也是如此。如果你传递应该对齐的指针,但不是,那也是错误的。

同时,可能只有一个或两个函数需要一些变量进行对齐,毕竟它从来都不是问题。如果人们有足够的时间来理解他们所负责的代码,那将会很好,但我想这不是它在真实世界中的作用。