日期:2014-05-16  浏览次数:20642 次

gcc链接错误 "multiple definition of `memchr ..."
这个问题不知道怎么解决,我先解释一下,我用automak编译器编译一个工程,当然工程里有   .c文件(是以前的存c代码),还有后增加的.cpp文件,   是c++代码,里面用到了stl的   list和map,大概描述一下,是这样的:

工程中有   decode.h,decode.c文件,存c代码,
有个     pm.h,pm.cpp   文件,c++代码,
pm.h文件头大概这样:
#include   <list>
using   namespace   std;
typedef   std::list <...>     PMXX;
class   ..

还有个   pc.h,pc.cpp文件
pc.cpp   开头大概这样:
#include   "decode.h "
#include   "pm.h "

问题出现了,编译通过,就是在链接的时候出现一堆错误:
multiple   definition   of   `memchr   ...
...first   definition   ..     /usr/include/linux/...       std::memchr(...)

还有一些,都是说系统的一些api重复定义了,代码中是绝对没定义系统函数的,

后来发现,我把   pc.cpp文件中的   #include   "pm.h "   或者   #include   "decode.h "   任意一个注释掉,就链接通过了,但是一定要用这两个啊   ,找不到哪里的问题!!
不知道有哪位仁兄   遇到过这问题吗??



------解决方案--------------------
根据提示, memchr有多个定义.

我记得memchr是C的标准库函数呀.而你在自己写的代码中, 重新定义了这个函数, 所以出现这个错误, 把自己写的memchr函数改名应该就OK
------解决方案--------------------
#include <iostream>
#include <string>
#include <stdio.h>
#include <list>

int main(int argc,char **argv)
{
std::list <std::string> Test(3);
Test.push_back( "test one ");
Test.push_back( "test two ");
Test.push_back( "test three ");
std::list <std::string> ::iterator iTest=Test.begin();
while ( iTest != Test.end() )
{
std::cout < < *iTest++ < <std::endl;
}

char *s= "Hello, Programmers! ";
char *p;


p=(char*)memchr(s, 'P ',strlen(s));
if(p)
printf( "%s ",p);
else
printf( "Not Found! ");

getchar();
return 0;
}
仔细查下吧!