问题:一个命令行的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 模式下也是这样 ,静态连接就出错,动态连接完全没问题
使用动态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 模式下也是这样 ,静态连接就出错,动态连接完全没问题
#define new DEBUG_NEW
#endif这几行代码的位置?
我没有修改它#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完全正常
我没有修改下面是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之类的编译过程没有错误,
出错在连接时候,而且只有在指定静态连接的时候出错
奇怪了
是
public:
CArray<_int64>m_i64arr1;
CArray<_int64>m_i64arr2;这两条出问题
改成
CDWordArray m_i64arr1;
CDWordArray m_i64arr2;就没有任何问题了,
为什么?
用的是2003
__int64是系统定义的
_int64也可以通过
没用
奇怪的是为什么不可以使用
CArray<_int64>m_data
改成LONGLONG ULONGLONG 都一样的问题
难道要
typedef CArray<_int64> I64Array
I64Array m_data?
编译不会出错误
但是如果使用静态连接,问题就出在连接上了
我的代码有部分是原来VC6下写的类
这个出错的是2003下写的一个新类
调用了原来的QTLOCK类编译NO ERROR
LINK 2 ERROR
活见鬼了
#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命令行的工程中去,添加头部文件
静态编译连接的时候就出错了
放到对话框程序里
完全正常了,连接没有问题这TMD是我的问题还是编译器的问题啊?