VS2017:在具有本机库的解决方案中从托管(clr)库链接到另一个库时,出现错误LNK2028无法解析的令牌

时间:2019-07-18 16:04:27

标签: c++ visual-studio-2017 linker clr managed

背景: 解决方案由本机(C ++)库和托管(C ++ / CLI)库组成。 库链接为DLL。 有一个用(/ clr)编译的托管库A。 与该库的其他本机代码链接也很好。

现在我将这个库分为A和B两部分。 B取决于A。 这是解决方案中第一次托管的库依赖于另一个托管的库。 请注意,两个库都必须同时用于本机代码。

这是链接B时出现的链接器错误类型: (类SKCSharpToolbox在A中定义)

  

错误LNK2028无法解析的令牌(0A000042)“公共:静态类   SKStringT __clrcall SKCSharpToolbox :: String2SKString(class   System :: String ^)“   (?String2SKString @ SKCSharpToolbox @@ $$ FSM?AV?$ SKStringT @ _W @@ PE $ AAVString @ System @@@ Z)   在函数“公共:静态类SKStringT”中引用   __cdecl SKWebUserAppPropsBuilder :: SerializeToJSON(类ISKWebUserAppPropsDataWrapper const&)“   (?SerializeToJSON @ SKWebUserAppPropsBuilder @@ $$ FSA?AV?$ SKStringT @ _W @@ AEBVISKWebUserAppPropsDataWrapper @@@@ Z)

通常, 为了使链接正常,我要做的就是将库标头(A.h)添加到依赖项的(B)stdafx.h中。 由于它是然后自动链接。 (见下文)

但是这次不起作用。

我觉得这是因为预期的__clrcall约定可能不是lib导出的约定。 但是我不知道这意味着什么以及如何解决这个问题。 这两个项目都使用(/ clr)编译。

这是链接库(A)头

#ifdef _SKMANAGELIBNAME
#undef _SKMANAGELIBNAME
#endif

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#if defined(_DEBUG)
    #define _SKMANAGELIBNAME "skmanaged.lib"
#else
    #define _SKMANAGELIBNAME "skmanage.lib"
#endif

#pragma message( "Automatic linking with " _SKMANAGELIBNAME  )
#pragma comment(lib,_SKMANAGELIBNAME)

#include "SKManageDecl.h"

这是SKManageDecl.h:

#pragma once

#ifndef SKMANAGE_EXPORT
#ifdef _SKMANAGEDLL
  #define SKMANAGE_EXPORT __declspec(dllexport)
  #define SKMANAGEIMPLEMENT
#else
  #define SKMANAGE_EXPORT __declspec(dllimport)
  #define SKMANAGEIMPLEMENT extern
#endif
#endif


#ifdef _MANAGED
  #define GCROOT(a) gcroot<a^>
  #define MUSING(a) using namespace a;
  #define MPUBLIC public
#else
  #define GCROOT(a) void*
  #define MUSING(a)
  #define MPUBLIC
#endif

0 个答案:

没有答案