场景1:
我想将一个新库(libA)链接到我的程序中,libA是使用带有-std=gnu99标志的gcc构建的,而我的程序的当前库是在没有该选项的情况下构建的(假设gcc默认使用-std=gnu89)。
情景2:
libB是用一些预处理器标志构建的,比如“-D_XOPEN_SOURCE-D_XOPEN_SOURCE_EXTENDED”以启用XPG4功能,例如struct msghdr的msg_control member。虽然libC不是在没有那些预处理器标志的情况下构建的,但是它是与libB链接的。
链接使用不同预处理器标志或C标准构建的库是错误的吗?
我关注的主要是结构定义不匹配。
谢谢。

最佳答案

场景1对你来说是完全安全的。GCC中的选项检查代码是否与标准兼容,但与ABI无关,因此您可以将预编译的代码与不同的std选项结合起来。
场景2可能不安全。我在这里只举一个简单的例子,实际情况可能要复杂得多。
考虑一下,你有一些功能,比如:

#ifdef MYDEF
int foo(int x) { ... }
#else
int foo(float x) { ... }
#endif

你用std=a.o编译-DMYDEF,用b.o调用bar中的函数a.o。接下来你把它连接起来,一切看起来都很好。然后在运行时所有操作都会失败,您可能很难调试为什么要从一个模块传递int,而在被调用方则需要float。
一些更棘手的情况可能包括条件定义的结构字段、调用约定、全局变量大小。
假设你所有的资料都是用同一种语言写的,只改变std选项和宏定义。C和C++代码的结合有时非常棘手,同意米哈伊尔的观点。

关于c - 链接使用不同的预处理器标志或C标准构建的库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14496704/

10-11 19:41