C++-恶意双编译器标志 我需要对C++中的编译器标志进行一些帮助。我正在使用一个库,它是从windows到linux的端口,必须使用-malign双标志“for Win32 compatibility”进行编译。我的理解是,这意味着我必须用这个标志编译自己的代码?那么其他的共享库呢,它们也要用这个标志重新编译吗?如果是的话,有什么办法可以解决这个问题吗

C++-恶意双编译器标志 我需要对C++中的编译器标志进行一些帮助。我正在使用一个库,它是从windows到linux的端口,必须使用-malign双标志“for Win32 compatibility”进行编译。我的理解是,这意味着我必须用这个标志编译自己的代码?那么其他的共享库呢,它们也要用这个标志重新编译吗?如果是的话,有什么办法可以解决这个问题吗,c++,shared-libraries,compiler-flags,memory-corruption,C++,Shared Libraries,Compiler Flags,Memory Corruption,我是linux新手(也是c++),所以尽管我尝试重新编译我在项目中使用的所有库,但递归地查找所有库及其依赖的库的源代码并重新编译所有内容太复杂了 编辑: 谢谢你的回答。一些背景:该库控制对USB连接摄像头的初始化和访问。问题是没有这个标志,奇怪的事情开始发生。相机初始化失败,USB连接错误,这似乎是随机的。我还得到了堆栈上几个c字符串(const char*)的某种内存损坏。基本上,在我调用这个摄像头的初始化之前,它们指向一个目录路径;初始化之后,它们指向字符串“me”。这对我来说非常令人困惑。

我是linux新手(也是c++),所以尽管我尝试重新编译我在项目中使用的所有库,但递归地查找所有库及其依赖的库的源代码并重新编译所有内容太复杂了

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

这是一个伟大的旗帜名称!我想知道是否也有恶意的影响?但严重的是,该标志控制着轻微的优化:

-恶意双重

-mno双对齐

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


库或代码不太可能需要此标志。通常,您不应该使用对齐控制标志,除非您确切知道自己在做什么。如果您确实觉得需要使用它们,请参阅GCC手册。

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

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


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

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


同时,可能只有一个或两个函数需要对齐一些变量,而这根本不是问题。如果人们有足够的时间来理解他们负责的代码,那就太好了,但我想这在现实世界中是行不通的

马丁,听起来你真的需要和图书馆的作者谈谈@osgx的答案可能是正确的——也许它与库使用的文件格式有关,因为相机可能被视为某种文件系统。但是,重新编译所有内容以支持一些设计糟糕的文件格式并不是一个好主意。我认为可能就是这样。库的makefile提到了一些关于结构对齐的内容。所以我可能会将这个pragma pack指令添加到库中“需要”对齐的每个结构中?因为我使用的是linux gcc,所以该指令似乎不可用。@Martin gcc支持打包pragmas-请阅读我在回答中提供链接的手册,第5.53.7节。这是否能解决你的问题,我不能说。@Martin,USB驱动程序确实使用二进制结构。它被用作特殊文件,程序必须生成位精确的命令到网络摄像机。您只需要为库对齐文件,库会生成此usb设备的位数据。