我用vc.net2003,window2000sp4,编译emule0.44b通过,但在链接的时候出问题,显示LNK2005,许多符号重复定义,比如_open在libcmtd.lib中已经定义过。由于emule使用多个库,暂时不能定位问题的所在,求救各位兄弟。

解决方案 »

  1.   

    Linking...
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _fopen 已经在 libcmtd.lib(fopen.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _fclose 已经在 libcmtd.lib(fclose.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _fread 已经在 libcmtd.lib(fread.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _fwrite 已经在 libcmtd.lib(fwrite.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _fseek 已经在 libcmtd.lib(fseek.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _ftell 已经在 libcmtd.lib(ftell.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _fflush 已经在 libcmtd.lib(fflush.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _fputc 已经在 libcmtd.lib(fputc.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _getc 已经在 libcmtd.lib(fgetc.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _free 已经在 libcmtd.lib(dbgheap.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _malloc 已经在 libcmtd.lib(dbgheap.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _floor 已经在 libcmtd.lib(floor_pentium4.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _ceil 已经在 libcmtd.lib(ceil_pentium4.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _strncpy 已经在 libcmtd.lib(strncpy.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _calloc 已经在 libcmtd.lib(dbgheap.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _realloc 已经在 libcmtd.lib(dbgheap.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _strncmp 已经在 libcmtd.lib(strncmp.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _sprintf 已经在 libcmtd.lib(sprintf.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _isprint 已经在 libcmtd.lib(_ctype.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _abort 已经在 libcmtd.lib(abort.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _fprintf 已经在 libcmtd.lib(fprintf.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _gmtime 已经在 libcmtd.lib(gmtime.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _exit 已经在 libcmtd.lib(crt0dat.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _sscanf 已经在 libcmtd.lib(sscanf.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _getenv 已经在 libcmtd.lib(getenv.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __assert 已经在 libcmtd.lib(assert.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _memmove 已经在 libcmtd.lib(memmove.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _qsort 已经在 libcmtd.lib(qsort.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _rand 已经在 libcmtd.lib(rand.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _strstr 已经在 libcmtd.lib(strstr.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _vsprintf 已经在 libcmtd.lib(vsprintf.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __isctype 已经在 libcmtd.lib(isctype.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _strrchr 已经在 libcmtd.lib(strrchr.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _atoi 已经在 libcmtd.lib(atox.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _atof 已经在 libcmtd.lib(atof.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _strchr 已经在 libcmtd.lib(strchr.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _vfprintf 已经在 libcmtd.lib(vfprintf.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _strtok 已经在 libcmtd.lib(strtok.obj) 中定义
    MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 libcmtd.lib(typinfo.obj) 中定义
    MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已经在 libcmtd.lib(typinfo.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __open 已经在 libcmtd.lib(open.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __unlink 已经在 libcmtd.lib(unlink.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __setmode 已经在 libcmtd.lib(setmode.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __read 已经在 libcmtd.lib(read.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __write 已经在 libcmtd.lib(write.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __lseek 已经在 libcmtd.lib(lseek.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __close 已经在 libcmtd.lib(close.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __strdup 已经在 libcmtd.lib(strdup.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __CrtDbgReport 已经在 libcmtd.lib(dbgrpt.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __resetstkoflw 已经在 libcmtd.lib(resetstk.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: _wcscpy 已经在 libcmtd.lib(wcscat.obj) 中定义
      

  2.   

    MSVCRTD.lib(MSVCR71D.dll) : error LNK2005: __setmbcp 已经在 libcmtd.lib(mbctype.obj) 中定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _fopen 已在 libcmtd.lib(fopen.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _fclose 已在 libcmtd.lib(fclose.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _fread 已在 libcmtd.lib(fread.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _fwrite 已在 libcmtd.lib(fwrite.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _fseek 已在 libcmtd.lib(fseek.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _ftell 已在 libcmtd.lib(ftell.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _fflush 已在 libcmtd.lib(fflush.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _fputc 已在 libcmtd.lib(fputc.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _getc 已在 libcmtd.lib(fgetc.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _free 已在 libcmtd.lib(dbgheap.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _malloc 已在 libcmtd.lib(dbgheap.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _floor 已在 libcmtd.lib(floor_pentium4.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _ceil 已在 libcmtd.lib(ceil_pentium4.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _strncpy 已在 libcmtd.lib(strncpy.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _calloc 已在 libcmtd.lib(dbgheap.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _realloc 已在 libcmtd.lib(dbgheap.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _strncmp 已在 libcmtd.lib(strncmp.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _sprintf 已在 libcmtd.lib(sprintf.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _isprint 已在 libcmtd.lib(_ctype.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _abort 已在 libcmtd.lib(abort.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _fprintf 已在 libcmtd.lib(fprintf.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _gmtime 已在 libcmtd.lib(gmtime.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _exit 已在 libcmtd.lib(crt0dat.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _sscanf 已在 libcmtd.lib(sscanf.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _getenv 已在 libcmtd.lib(getenv.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __assert 已在 libcmtd.lib(assert.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _memmove 已在 libcmtd.lib(memmove.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _qsort 已在 libcmtd.lib(qsort.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _rand 已在 libcmtd.lib(rand.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _strstr 已在 libcmtd.lib(strstr.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _vsprintf 已在 libcmtd.lib(vsprintf.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __isctype 已在 libcmtd.lib(isctype.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _strrchr 已在 libcmtd.lib(strrchr.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _atoi 已在 libcmtd.lib(atox.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _atof 已在 libcmtd.lib(atof.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _strchr 已在 libcmtd.lib(strchr.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _vfprintf 已在 libcmtd.lib(vfprintf.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _strtok 已在 libcmtd.lib(strtok.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(ti_inst.obj) : warning LNK4006: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已在 libcmtd.lib(typinfo.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(ti_inst.obj) : warning LNK4006: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已在 libcmtd.lib(typinfo.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __open 已在 libcmtd.lib(open.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __unlink 已在 libcmtd.lib(unlink.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __setmode 已在 libcmtd.lib(setmode.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __read 已在 libcmtd.lib(read.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __write 已在 libcmtd.lib(write.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __lseek 已在 libcmtd.lib(lseek.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __close 已在 libcmtd.lib(close.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __strdup 已在 libcmtd.lib(strdup.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __CrtDbgReport 已在 libcmtd.lib(dbgrpt.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __resetstkoflw 已在 libcmtd.lib(resetstk.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: _wcscpy 已在 libcmtd.lib(wcscat.obj) 中定义;已忽略第二个定义
    MSVCRTD.lib(MSVCR71D.dll) : warning LNK4006: __setmbcp 已在 libcmtd.lib(mbctype.obj) 中定义;已忽略第二个定义
       正在创建库 .\Debug/emule.lib 和对象 .\Debug/emule.exp
    LINK : warning LNK4098: 默认库“MSVCRTD”与其他库的使用冲突;使用 /NODEFAULTLIB:library
    LINK : warning LNK4098: 默认库“mfc71d.lib”与其他库的使用冲突;使用 /NODEFAULTLIB:library
    LINK : warning LNK4098: 默认库“mfcs71d.lib”与其他库的使用冲突;使用 /NODEFAULTLIB:library
    .\Debug/emule.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
      

  3.   

    从现象来看,_open此类的函数属于由操作系统实现的接口函数。一般我们在使用函数时,更多的是使用open等符合POSIX标准的函数以便于移植,出现多个本应系统提供的函数,原因可能是emule0.44b他提供了自己的_open函数,换句话说,虽然emule使用多个库,那么他究竟用到MSC提供的库了吗?
      

  4.   

    不好意思。我分析错了。
    MSVCRTD.lib 这个是MFC的库
    libcmtd.lib 这个应该是MSC一贯所用的基本库。
    剩下的我就不知道了
      

  5.   

    哈哈,可能是不同的lib分别调用了msvcrtd.lib和libcmtd.lib。
    这两个库会冲突。但是简单地忽略掉一个库,又会报很多错。
      

  6.   

    改成单线程|多线程|/clr试试看
      

  7.   

    Linker Tools Error LNK2005
    symbol already defined in object
    The given symbol, displayed in its decorated form, was multiply defined.One of the following may be a cause: 
    The most common cause of this error is accidentally linking with both the single-threaded and multithreaded libraries. Ensure that the application project file includes only the appropriate libraries and that any third-party libraries have appropriately created single-threaded or multithreaded versions.