C++ 有人举过用C++;?

C++ 有人举过用C++;?,c++,linux,gcc,g++,C++,Linux,Gcc,G++,我在网上搜索了很多,但是我找不到一个适用于g+的例子,所有的例子都适用于GCC 我经常遇到的错误是: wrap_malloc.o: In function `__wrap_malloc(unsigned int)': wrap_malloc.cc:(.text+0x20): undefined reference to `__real_malloc(unsigned int)' wrap_malloc.o: In function `main': wrap_malloc.cc:(.text+0x

我在网上搜索了很多,但是我找不到一个适用于g+的例子,所有的例子都适用于GCC

我经常遇到的错误是:

wrap_malloc.o: In function `__wrap_malloc(unsigned int)':
wrap_malloc.cc:(.text+0x20): undefined reference to `__real_malloc(unsigned int)'
wrap_malloc.o: In function `main':
wrap_malloc.cc:(.text+0x37): undefined reference to `__wrap_malloc'
collect2: ld returned 1 exit status
创建此错误的代码如下所示(如果我使用GCC编译此代码并将头从cstdio更改为stdio.h,则此代码有效):


如果这是完整的代码,那么您遇到的问题是您没有实现
\uuu real\u malloc()


顺便说一下,带有双下划线的标识符由语言保留。你可能想考虑选择不同的名字。

< P>当你使用C++编译器时,所有的名字都被损坏了。当您运行
nm wrap\u malloc.o
时,这意味着什么就变得很清楚了,这应该会给您提供如下信息:

00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
         U __Z13__real_mallocj
00000000 T __Z13__wrap_mallocj
         U _printf
extern "C" void *__real_malloc(size_t);

extern "C" void *__wrap_malloc(size_t c) {
  printf("My malloc called with %d\n", c);
  return __real_malloc(c);
}
这意味着您使用(U)一个名为
\uuuuuz13\uuureal\umallocj
的符号,并在名为
\uuuuz13\uwrap\umallocj
的文本段(T)中定义一个符号。但您可能需要一个名为
\uuuuuureal\umalloc
的符号。要实现这一点,您必须告诉编译器
\uuu real\u malloc
是一个C风格的函数,如下所示:

00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
         U __Z13__real_mallocj
00000000 T __Z13__wrap_mallocj
         U _printf
extern "C" void *__real_malloc(size_t);

extern "C" void *__wrap_malloc(size_t c) {
  printf("My malloc called with %d\n", c);
  return __real_malloc(c);
}
现在
nm
的输出为:

00000000 b .bss
00000000 d .data
00000000 r .rdata
00000000 t .text
         U ___real_malloc
00000000 T ___wrap_malloc
         U _printf
您可以看到名称
\u printf
没有更改。这是因为在头文件中,许多函数已经声明为
extern“C”


注意:我在cygwin环境中的Windows上完成了上述所有操作。这就是为什么在外部符号中有一个额外的前导下划线。

这段代码是一个演示,我计划使用包装器进行测试。如果代码是用--wrap=malloc编译的,它将把所有调用重定向到_wrap\u malloc。如果你想使用真实的东西,你必须称之为uuureal\umalloc。以下是文档=>对符号的任何未定义引用将解析为“\uuu wrap symbol”。对“_realsymbol”的任何未定义引用将解析为symbol。这可用于为系统函数提供包装器。包装函数应称为“\u包装符号”。如果它想调用系统函数,应该调用“\u real symbol”。非常感谢!现在我明白了问题所在。