静态连接出错,动态连接完全正常,哪里出问题了?

danscort2000 2006-05-16 08:39:25
问题:一个命令行的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 模式下也是这样 ,静态连接就出错,动态连接完全没问题
...全文
266 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
danscort2000 2006-05-17
  • 打赏
  • 举报
回复
用也没问题
编译不会出错误
但是如果使用静态连接,问题就出在连接上了
我的代码有部分是原来VC6下写的类
这个出错的是2003下写的一个新类
调用了原来的QTLOCK类

编译NO ERROR
LINK 2 ERROR
活见鬼了
DentistryDoctor 2006-05-17
  • 打赏
  • 举报
回复
偶也这样用,但没碰到你说的问题。也许是见识短了。
danscort2000 2006-05-17
  • 打赏
  • 举报
回复
改成__int64还是同样的错误
没用
奇怪的是为什么不可以使用
CArray<_int64>m_data
改成LONGLONG ULONGLONG 都一样的问题
难道要
typedef CArray<_int64> I64Array
I64Array m_data?
danscort2000 2006-05-17
  • 打赏
  • 举报
回复
_int64可以的
用的是2003
__int64是系统定义的
_int64也可以通过
DentistryDoctor 2006-05-17
  • 打赏
  • 举报
回复
你用的可是VC6?
DentistryDoctor 2006-05-17
  • 打赏
  • 举报
回复
?
_int64
__int64
?
danscort2000 2006-05-17
  • 打赏
  • 举报
回复
问题定位到了
奇怪了

public:
CArray<_int64>m_i64arr1;
CArray<_int64>m_i64arr2;

这两条出问题
改成
CDWordArray m_i64arr1;
CDWordArray m_i64arr2;

就没有任何问题了,
为什么?
danscort2000 2006-05-17
  • 打赏
  • 举报
回复
工程属性是默认的
我没有修改

下面是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之类的

编译过程没有错误,
出错在连接时候,而且只有在指定静态连接的时候出错


DentistryDoctor 2006-05-17
  • 打赏
  • 举报
回复
不太清楚你的工程选项。如果可以,将工程发过来看看就会很快解决问题了。
danscort2000 2006-05-17
  • 打赏
  • 举报
回复
顶上去
danscort2000 2006-05-17
  • 打赏
  • 举报
回复
又做了个测试,同样的代码
放到对话框程序里
完全正常了,连接没有问题

这TMD是我的问题还是编译器的问题啊?
danscort2000 2006-05-17
  • 打赏
  • 举报
回复
简单的做了一下测试


#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命令行的工程中去,添加头部文件
静态编译连接的时候就出错了



danscort2000 2006-05-16
  • 打赏
  • 举报
回复
在头部
我没有修改它

#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完全正常

DentistryDoctor 2006-05-16
  • 打赏
  • 举报
回复
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

这几行代码的位置?

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧