假设我有一个用编译器A编译的库。它使用malloc()
分配内存并将它留给我free()
。它没有提供特殊的免费功能。
我可以用编译器B编译我的程序(使用这个库)吗?或者我是否必须担心一个编译器(标准库)malloc
与另一个free
不兼容?
除了一般性问题,我还想知道这些编译器的具体答案:OS X上的系统clang与MacPorts的gcc 4.9或5。
答案 0 :(得分:4)
它应该不是问题。操作系统的ABI指定程序如何调用库函数,并且所有程序和库都应该符合这一点。这允许您将使用不同编译器创建的程序链接在一起。
您的问题表明编译器和库之间存在混淆。使用编译器A编译库并不意味着它使用库A的malloc
函数。在链接步骤中指定库,而不是在编译库时指定。创建可执行程序时,将主程序与编译的库和C运行时库链接。 C运行时库中提供了malloc
和free
,结果可执行文件中只有一个。
答案 1 :(得分:1)
free
和malloc
在编译器之间并不总是兼容。具体而言,they are not compatible between MSVC and MinGW。
我遇到以下情况:
我使用的C库有一个返回数组的函数。用户在不再需要时必须为free
d。我使用MSVC使用此库的预编译DLL。但是,DLL是使用MinGW编译的。在MinGW的free
分配的内存上使用MSVC的malloc
会导致崩溃。但是确保free
/ malloc
总是在兼容对中使用避免了麻烦,即使我的程序使用的是与DLL不同的C编译器。