背景: 解决方案由本机(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