常见的LNK 2019 - 头文件中的函数声明 - 源文件中的定义

时间:2012-06-26 11:54:34

标签: c++ linker c++-cli

考虑到这是一个常见问题,如果使用此文件逻辑,可能会出现此错误的原因:

  • Utils.h:声明bool Dummy();
  • Utils.cpp:define bool Dummy() {return true;}
  • ClassA.h:无关紧要的class A { bool sheet; public: A(); };
  • ClassA.cpp:不相关的代码:

     #include "Utils.h"
     #include "ClassA.h"
     A::A() { sheet = Dummy(); }
    

    注意:所有标头文件都包含警卫#pragma once宏。

错误:类似这样的

Error   2   error LNK2028: unresolved token (0A00000B) "bool __clrcall Dummy(void)" 

Error   3   error LNK2019: unresolved external symbol "bool __clrcall Dummy(void)" .... in ClassA.obj

1 个答案:

答案 0 :(得分:2)

  

bool __ clrcall Dummy(void)

您正在使用/ clr编译ClassA.cpp文件,生成托管代码。但是你的Dummy()函数是在没有/ clr的情况下编译的,这使得调用约定为__cdecl。链接器注意到差异,它无法找到Dummy的托管实现。

您必须告诉编译器Utils.cpp是为本机代码构建的。像这样修复ClassA.cpp:

#pragma managed(push, off)
#include "Utils.h"
#pragma managed(pop)
#include "ClassA.h"
// etc...