链接到使用不同编译器标志构建的静态库是否安全

11 c++ static-libraries googletest

我使用GoogleTest来测试我的C++项目,在发现预编译的库不再在Ubuntu包中分发之后,我在项目网站上找到了以下内容:

如果使用不同的编译器标志编译Google Test和测试代码,他们可能会看到相同类/函数/变量的不同定义(例如,由于在Google Test中使用了#if).因此,为了您的理智,我们建议您避免安装预编译的Google Test库.相反,每个项目都应该编译Google Test本身,以便确保Google Test和测试都使用相同的标志.

我从中得到的结论是,将GoogleTest与正在测试的项目分开编译是一个坏主意.我不明白的是这是否只是一个GoogleTest的事情,或者这是否是连接库的一般事项.

是否存在链接到预编译的第三方库,编译器标志或其他方面不安全的情况,如果没有,GoogleTest有什么特别之处?

Dav*_*e S 6

有一些编译器标志,特别是那些使用对齐的标志,可能会导致问题.

来自GCC i386和x86-64标志

-malign-double
-mno-align-double

控制GCC是否在双字边界或单字边界上对齐双长,长双和长长变量.在双字边界上对齐双变量会产生在奔腾上运行得更快的代码,代价是更多的内存.

在x86-64上,默认启用-malign-double.

警告:如果使用-malign-double开关,则包含上述类型的结构的排列方式与386的已发布应用程序二进制接口规范的排列方式不同,并且与不使用该开关编译的代码中的结构不兼容.

例如,在32位系统上使用该标志将使双精度数和长long数为64位对齐.如果编译没有标志的库,则在使用标志时尝试使用库,包含上述类型的结构可能具有不同的对齐方式,并且可能无法互操作.

其他(更简单)的情况也可以是确保相同的#defines集合以确保使用相同的函数/结构/类定义(以及其他此类ODR违规).例如,在gcc中使用'--std = c ++ 11',它启用标准库类的C++ 11版本,在某些情况下与先前版本不同.