我使用GoogleTest来测试我的C ++项目,在发现预编译的库不再在Ubuntu包中分发之后,我在项目网站上找到了以下内容:
如果您使用不同的编译器编译Google Test和您的测试代码 标志,他们可能会看到不同的定义 类/函数/变量(例如,由于在Google Test中使用#if)。 因此,为了您的理智,我们建议您避免安装 预编译的Google测试库。相反,每个项目都应该 编译Google Test本身就可以确保它一样 标志用于Google Test和测试。
我从中得到的结论是,将GoogleTest与正在测试的项目分开编译是一个坏主意。我不明白的是,这只是一个GoogleTest的事情,还是链接库的一般情况。
问题
是否存在链接到预编译的第三方库,编译器标志或其他方面不安全的情况,如果没有,GoogleTest有什么特别之处?
答案 0 :(得分:6)
有一些编译器标志,特别是那些使用对齐的标志,可能会导致问题。
-malign双
-mno对准双
控制GCC是否在双字边界或单字边界上对齐双长,长双和长长变量。在双字边界上对齐双变量会产生在奔腾上运行得更快的代码,代价是更多的内存。
在x86-64上,默认启用-malign-double。
警告:如果使用-malign-double开关,则包含上述类型的结构的排列方式与386的已发布应用程序二进制接口规范不同,与不使用该开关编译的代码中的结构不兼容。
例如,在32位系统上使用该标志将使双精度和长long为64位对齐。如果您编译没有该标志的库,然后在使用该标志时尝试使用该库,则包含上述类型的结构可能具有不同的对齐方式,并且可能无法互操作。
其他(更简单)的情况也可以是确保同一组#defines以确保使用相同的函数/结构/类定义(以及其他此类ODR违规)。例如,在gcc中使用'--std = c ++ 11',它启用标准库类的C ++ 11版本,在某些情况下与先前版本不同。