我在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)
{
}

解决方案 »

  1.   

    Operations.lib
    估计是这个lib的地址设得不对。
      

  2.   

    ..\Operations\Debug\Operations.lib
    是相对路径,你的layer.exe文件默认会在layer\debug目录下。那么..\只是能回到layer目录,如果你的Operations目录和layer在同一层,那么尝试用..\..\Operations\Debug\Operations.lib
      

  3.   


    我试了,错误变成 1>LINK : fatal error LNK1104: 无法打开文件“..\..\Operations\Debug\Operations.lib”
    我觉得前面不用加..\了,因为我还有其他的工程文件添加的方式都是前面只有一个..\,应该不是这个问题。
      

  4.   


    如果不确定路径的话,也可以这样:
    Operations是一个DLL吧,你把Operations.lib文件,以及你编写的Operations.h文件,首先把它们一起拷贝到layer项目目录中,然后在解决方案资源管理器树形结构中选中layer项目,右键,一次选择“添加”—>现有项,选中以上两个文件,"添加"即可
    接下来要在layer中的cpp文件中添加#include "Operations.h" 、 #pragma comment(lib,"Operations.lib")最后把Operations.dll文件要拷贝到可执行文件(layer.exe)所在的目录中去
      

  5.   

    应该就是路径的问题了。我一般不会去这样自找麻烦,都是将Oprations.lib编译后自动复制到目标工程目录,这样目标工程引入lib时只需要直接用文件名。
      

  6.   


    因为这是一个大的程序,而且其他的project也是这种方式,所以我新建一个project也就用这种方式了,但是就是会出现无法识别的外部符号。而且就这个新建的工程会出现。我觉得还是哪里的设置问题。
      

  7.   

    你就直接把lib文件放到Layer目录下,然后link时直接用文件名试试是否OK
      

  8.   

    晕。
    就是将..\Operations\Debug\Operations.lib
    改成Operations.lib
      

  9.   

    不行啊。我还发现一个问题,为啥我那个project的debug文件夹里头会有一个operation.lib呢,就是说有一个operations.lib又有一个operation.lib。COperation我着这里是我新建的一个类,Operations是我新建的工程的名字。但是我在其他project的debug里面只能看到和工程名字相同的lib文件,对于类只有obj文件。
      

  10.   

    看来你这个工程比较混乱,只怕别人很难猜出问题来了。
    直接用本地的lib文件都会存在问题,那就复杂了。
      

  11.   

    能问一下问什么我新建的类也会生成一个和类名相同的lib文件么。
      

  12.   

    这类问题都是编译器找不到函数的实现造成的
    你自己分析下,那个函数的实现是在哪里,在cpp文件中?dll中?....
      

  13.   

    1.没有装2008
    2.不知道你工程的实际代码
    3.确实没有碰到过这种加个类就会生成.lib文件的现象
    4.有人批评说,自己没有实际测试过,不要瞎猜
    所以只能无语了。
      

  14.   

    装了2008啊,后来我有新建了一个工程,加个类就生成lib的情况没有了,只有对应类的一个obj文件,这个已经正常了。但是还是无法解析的外部符号。
      

  15.   

    那你把需要使用的动态库的lib和dll文件放到你当前工程目录下,在link中加入该lib文件,还是不行吗?难道你哪个动态库有问题?