我有以下问题:
Microsoft (我使用的是2008年的SP1)是否提供了覆盖standart C函数的任何方法,如malloc、memcpy
假设我有一个外部构建的库,它包含malloc.obj和memcpy.obj__。图书馆名为library.lib__。
如何构建我的项目,使编译器使用我的(覆盖)版本的malloc()和memcpy()例程,而不是那些提供的(我假设它们共享相同的语法)
整件事情的重点是改变我的项目中的每一个malloc,而不是像my_malloc或similiar这样的名称别名,这样我就可以比较性能。
,这有可能吗?
谢谢。
发布于 2010-09-27 20:32:57
尚未尝试此操作,但-在项目属性->链接器->输入中,将“忽略所有默认库”设置为“是”。然后设置‘附加依赖项’= library.lib;libcmt.lib。
这应该包括您的库在标准静态CRT之前。如果功能链接是相同的,在每一个,这应该是做你想要的。不过,在两个静态库中如何将malloc/free链接到操作系统可能会有问题。我猜想library.lib也重新定义了realloc/free/calloc等等?
发布于 2010-09-27 20:34:23
是否可以更改构建和链接过程,以便替换memcpy和malloc的实现?是。是个好主意吗?不怎么有意思。
最好只使用#define逻辑将这些函数重命名为memcpy_testing和malloc_testing,然后有一个在两者之间切换的#define。这样,您的解决方案就更适合于其他构建系统,而且对其他程序员来说也更清楚您到底在做什么。
编辑:为了与注释保持一致,下面是您将在共享头文件中所做的工作的示例:
#ifdef testing
# define my_malloc(n) testing_malloc(n)
#else
# define my_malloc(n) malloc(n)
#endif您甚至可以通过使用函数指针支持运行时切换(如果需要的话):
void *(__cdecl *my_malloc)(size_t);
// ...
void SetToTest() { my_malloc = testing_malloc; }
void SetToStandard() { my_malloc = malloc; }发布于 2010-09-27 20:39:08
您可以从通常可以在C++中找到的源代码构建自己版本的Visual运行时库,该库包含memcpy和malloc函数(以及其他函数)。然后将您的程序与自定义CRT连接起来。
或者,您可以使用这官方文章中的技术来挂钩分配函数。
https://stackoverflow.com/questions/3807505
复制相似问题