问题:一个命令行的WIN32程序,选择了MFC支持
使用动态MFC连接,编译没有问题
但是当我切换到静态MFC库连接的时候,编译出现下面的问题
我查找了MSDN,说是多线程库和单线程库混用了,这就奇怪了,
我只指定了多线程库,另外引入了ADO数据库 #import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
no_namespace \
rename( "EOF", "adoEOF" )静态编译出现下面的问题,我实在搞不清楚究竟是哪里出了问题,我尝试了去掉数据库,还是有这两个问题,大家帮我看看最可能是什么函数或者类被我重新定义了?TestApp error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 libcpmtd.lib(newop.obj) 中定义
TestApp error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) 已经在 libcpmtd.lib(newaop.obj) 中定义
TestApp fatal error LNK1169: 找到一个或多个多重定义的符号Release 模式下也是这样 ,静态连接就出错,动态连接完全没问题

解决方案 »

  1.   

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif这几行代码的位置?
      

  2.   

    在头部
    我没有修改它#include "stdafx.h"
    然后是几个相关的头文件
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    #import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace \
    rename( "EOF", "adoEOF" )问题是我使用RELEASE模式编译,也是这样的情况
    静态连接出错,动态连接MFC完全正常
      

  3.   

    工程属性是默认的
    我没有修改下面是STDAFX。H文件头#pragma once
    #include <iostream>
    #include <tchar.h>
    #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将为显式的#ifndef VC_EXTRALEAN
    #define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料
    #endif#include <afx.h>
    #include <afxwin.h>         // MFC 核心组件和标准组件
    #include <afxext.h>         // MFC 扩展
    #include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持
    #ifndef _AFX_NO_AFXCMN_SUPPORT
    #include <afxcmn.h> // MFC 对 Windows 公共控件的支持
    #endif // _AFX_NO_AFXCMN_SUPPORT#include <windows.h>
    #include <winsvc.h>
    #include "shlwapi.h"
    #include "stdlib.h"
    //--------下面是主程序头部文件引用的类,全部是我自己写的,是以前我用在另外一个程序上的#include "qtsocket.h"
    #include "qtmemory.h"
    #include "qtinirw.h"
    #include "bufferfile.h"
    #include "qtlog.h"
    #include "qtmemlog.h"
    #include "qtlock.h"
    #include "qtipwall.h"
    #include "qtdynamicip.h"然后是一些typedef之类的编译过程没有错误,
    出错在连接时候,而且只有在指定静态连接的时候出错
      

  4.   

    问题定位到了
    奇怪了

    public:
    CArray<_int64>m_i64arr1;
    CArray<_int64>m_i64arr2;这两条出问题
    改成
    CDWordArray m_i64arr1;
    CDWordArray m_i64arr2;就没有任何问题了,
    为什么?
      

  5.   

    _int64可以的
    用的是2003
    __int64是系统定义的
    _int64也可以通过
      

  6.   

    改成__int64还是同样的错误
    没用
    奇怪的是为什么不可以使用
    CArray<_int64>m_data
    改成LONGLONG ULONGLONG 都一样的问题
    难道要
    typedef CArray<_int64> I64Array
    I64Array m_data?
      

  7.   

    用也没问题
    编译不会出错误
    但是如果使用静态连接,问题就出在连接上了
    我的代码有部分是原来VC6下写的类
    这个出错的是2003下写的一个新类
    调用了原来的QTLOCK类编译NO ERROR
    LINK 2 ERROR
    活见鬼了
      

  8.   

    简单的做了一下测试
    #pragma once#ifndef TEST_I64ARR
    #define TEST_I64ARR
    #include "afxtempl.h"
    class Test64Class
    {
    private:
    CArray<__int64> i64arr1;
    CArray<__int64> i64arr2;
    public:
    Test64Class(void);
    virtual ~Test64Class(void);
    void Init(void);
    };
    #endif#include "StdAfx.h"
    #include ".\test64class.h"Test64Class::Test64Class(void)
    {
    }Test64Class::~Test64Class(void)
    {
    }void Test64Class::Init(void)
    {
    this->i64arr1.SetSize(10);
    this->i64arr2.SetSize(10);
    }上面分别是一个新的测试类的头部和实现
    放到WIN32命令行的工程中去,添加头部文件
    静态编译连接的时候就出错了
      

  9.   

    又做了个测试,同样的代码
    放到对话框程序里
    完全正常了,连接没有问题这TMD是我的问题还是编译器的问题啊?