我在vc2008中新建了一个工程叫Operations,然后在Operations中添加了一个新类COperation。我在另外一个工程Layer中的CLayer中引用COperation类,已经在Layer.h中添加了头文件operation.h,并在工程Layer的属性-》链接器-》输入 -》附加依赖项中添加了..\Operations\Debug\Operations.lib的依赖项。我在Layer.h中new一个COperation的类的代买: COperation *pOpe = new COperation();但是总是在这里报error LNK2019Layer.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall COperation::COperation(void)" (??0COperation@@QAE@XZ),该符号在函数 "public: bool __thiscall CLayer::PreClear(class CTypedPtrList<class CObList,class COperation *> &,class CTypedPtrList<class CObList,class COperation *> &)" (?PreClear@CLayer@@QAE_NAAV?$CTypedPtrList@VCObList@@PAVCOperation@@@@0@Z) 中被引用不知道什么愿意,在网上早了很多种解决方法都没有解决。我单独编译Operations工程的时候也没有错误。下面是COperation.h和。cpp文件 的代码。
==================================================================================
.h#pragma once
#include "stdafx.h"
#include "..\Object\Obj.h"
//#include "..\Style\Layer.h"
class COperation
{
public:
unsigned short m_nOperationTypeID; //用来指明是那种操作
unsigned short m_nMaxStep; //m_nMaxStep变量表示允许Undo/Redo的次数
unsigned short m_nCrrStep; //当前undo的位置
CObjList m_ObjList; //用来存储操作中的对象
//private:
// //删除obj操作,使用m_ObjList来存储对象 typeID = 1;
//CLayerList *m_pDelLayerList; //删除图层操作,typeID = 2;
// //删除图层和obj操作, typeID = 3;
//Point Offset_Point; //位移操作,记录偏移量 typeID = 4;
public:
void SetMaxStep(int nStep);
COperation(void);
~COperation(void); virtual void Undo(void);
virtual void Redo(void);
};
typedef CTypedPtrList<CObList, COperation*> COperationList;
========================================================================
.cpp#include "stdafx.h"
#include "Operation.h"
//COperation::COperation(void)
{
this->m_nMaxStep = 20;}COperation::~COperation(void)
{
POSITION pos = this->m_ObjList.GetTailPosition();
while(pos != NULL)
{
CObj* pObj = m_ObjList.GetPrev(pos);
if(pObj != NULL)
{
delete pObj;
pObj = NULL;
}
}
m_ObjList.RemoveAll();}void COperation::SetMaxStep(int nStep)
{
m_nMaxStep = nStep;}
void COperation::Undo(void)
{
}void COperation::Redo(void)
{
}
==================================================================================
.h#pragma once
#include "stdafx.h"
#include "..\Object\Obj.h"
//#include "..\Style\Layer.h"
class COperation
{
public:
unsigned short m_nOperationTypeID; //用来指明是那种操作
unsigned short m_nMaxStep; //m_nMaxStep变量表示允许Undo/Redo的次数
unsigned short m_nCrrStep; //当前undo的位置
CObjList m_ObjList; //用来存储操作中的对象
//private:
// //删除obj操作,使用m_ObjList来存储对象 typeID = 1;
//CLayerList *m_pDelLayerList; //删除图层操作,typeID = 2;
// //删除图层和obj操作, typeID = 3;
//Point Offset_Point; //位移操作,记录偏移量 typeID = 4;
public:
void SetMaxStep(int nStep);
COperation(void);
~COperation(void); virtual void Undo(void);
virtual void Redo(void);
};
typedef CTypedPtrList<CObList, COperation*> COperationList;
========================================================================
.cpp#include "stdafx.h"
#include "Operation.h"
//COperation::COperation(void)
{
this->m_nMaxStep = 20;}COperation::~COperation(void)
{
POSITION pos = this->m_ObjList.GetTailPosition();
while(pos != NULL)
{
CObj* pObj = m_ObjList.GetPrev(pos);
if(pObj != NULL)
{
delete pObj;
pObj = NULL;
}
}
m_ObjList.RemoveAll();}void COperation::SetMaxStep(int nStep)
{
m_nMaxStep = nStep;}
void COperation::Undo(void)
{
}void COperation::Redo(void)
{
}
解决方案 »
- 这样的问题你遇到过嘛?!关于公制,英制,小数点问题
- 在服务器上有用C# Remoting来编写的服务程序,在客户端MFC程序如何与服务器的程序进行通信?谢谢
- 请问如何在视区拖动按钮又不闪烁?
- #pragma warning(default:4001)什么意思
- OLE MS WORD 如何保存文件?
- 今天去一家公司面试,给了两个题目叫我回来做,大家看能不能提供一点帮助,每个题给50分!
- 有哪位高手在vc.net环境下用过CJLibrary?为什么我在6.0下编译通过,.net下就出错。
- 请教围棋自动提子的算法
- 我想在文本框中输入一千行数据.并实现滚动效果,我该怎么作?
- 请教一个 简单问题 ,谢谢
- VC++ Socket 如何获取 返回的http 的头信息
- visual studio 2005 一个bug
估计是这个lib的地址设得不对。
是相对路径,你的layer.exe文件默认会在layer\debug目录下。那么..\只是能回到layer目录,如果你的Operations目录和layer在同一层,那么尝试用..\..\Operations\Debug\Operations.lib
我试了,错误变成 1>LINK : fatal error LNK1104: 无法打开文件“..\..\Operations\Debug\Operations.lib”
我觉得前面不用加..\了,因为我还有其他的工程文件添加的方式都是前面只有一个..\,应该不是这个问题。
如果不确定路径的话,也可以这样:
Operations是一个DLL吧,你把Operations.lib文件,以及你编写的Operations.h文件,首先把它们一起拷贝到layer项目目录中,然后在解决方案资源管理器树形结构中选中layer项目,右键,一次选择“添加”—>现有项,选中以上两个文件,"添加"即可
接下来要在layer中的cpp文件中添加#include "Operations.h" 、 #pragma comment(lib,"Operations.lib")最后把Operations.dll文件要拷贝到可执行文件(layer.exe)所在的目录中去
因为这是一个大的程序,而且其他的project也是这种方式,所以我新建一个project也就用这种方式了,但是就是会出现无法识别的外部符号。而且就这个新建的工程会出现。我觉得还是哪里的设置问题。
就是将..\Operations\Debug\Operations.lib
改成Operations.lib
直接用本地的lib文件都会存在问题,那就复杂了。
你自己分析下,那个函数的实现是在哪里,在cpp文件中?dll中?....
2.不知道你工程的实际代码
3.确实没有碰到过这种加个类就会生成.lib文件的现象
4.有人批评说,自己没有实际测试过,不要瞎猜
所以只能无语了。