我一直在与Microsoft的CRT(C运行时库)概念问题纠缠不清。对于任何项目,您必须编译所有所需的库以链接到相同版本的CRT。
第一个问题是当您的项目静态链接到CRT(/MT)时。那么所有依赖的库也必须静态地链接它们自己的CRT。因此,每个库都有自己的版本,例如malloc()。如果您去年在A系统上编译了其中一个库,则该CRT版本可能与您当前在另一个带服务包3+的B系统上使用的版本不同。如果您释放由库分配的对象,则可能会遇到问题。
因此,动态链接的CRT似乎是正确的选择(/MD)。使用dll,所有库都会获取系统上当前的CRT实现。除了Microsoft的Side by Side机制并非如此。相反,您会获得在您编译的库上标记的CRT版本,并且该版本的DLL提供给该库。因此,之前描述的完全相同的问题可能会发生。您在一年前在A系统上编译了一个库并使用了一个CRT。一年后有新的升级版本。您的主程序获取带有一个CRT版本的DLL,库获取带有另一个CRT版本的DLL,同样可能会出现问题。
那你怎么办?我意识到跨库内存分配是不被看好的。但可以忽略malloc示例并想出另一个示例。您是否要求每个开发人员在其计算机上重新编译每个依赖库,以确保所有内容都使用相同的CRT?然后再次为发布重新编译每个库?
在Linux上,这是如何工作的?那是我的主要兴趣。GCC提供CRT还是Linux系统本身带有CRT库?我从未在Makefile中显式链接CRT。
在Linux上,动态库链接的是什么CRT?在机器上最新的一个,还是更像“side by side”的机制。
第一个问题是当您的项目静态链接到CRT(/MT)时。那么所有依赖的库也必须静态地链接它们自己的CRT。因此,每个库都有自己的版本,例如malloc()。如果您去年在A系统上编译了其中一个库,则该CRT版本可能与您当前在另一个带服务包3+的B系统上使用的版本不同。如果您释放由库分配的对象,则可能会遇到问题。
因此,动态链接的CRT似乎是正确的选择(/MD)。使用dll,所有库都会获取系统上当前的CRT实现。除了Microsoft的Side by Side机制并非如此。相反,您会获得在您编译的库上标记的CRT版本,并且该版本的DLL提供给该库。因此,之前描述的完全相同的问题可能会发生。您在一年前在A系统上编译了一个库并使用了一个CRT。一年后有新的升级版本。您的主程序获取带有一个CRT版本的DLL,库获取带有另一个CRT版本的DLL,同样可能会出现问题。
那你怎么办?我意识到跨库内存分配是不被看好的。但可以忽略malloc示例并想出另一个示例。您是否要求每个开发人员在其计算机上重新编译每个依赖库,以确保所有内容都使用相同的CRT?然后再次为发布重新编译每个库?
在Linux上,这是如何工作的?那是我的主要兴趣。GCC提供CRT还是Linux系统本身带有CRT库?我从未在Makefile中显式链接CRT。
在Linux上,动态库链接的是什么CRT?在机器上最新的一个,还是更像“side by side”的机制。