我使用VS创建了一个静态“C”库。
我正在为另一个VS控制台C应用程序使用相同的库文件,它的工作正常,但是当我使用Windows窗体应用程序时,它无法正常工作。
在此论坛中提到了这么多查询但没有得到帮助。
是否有任何命名约定来从Windows窗体托管c ++调用静态库函数?
像这样得到错误
错误LNK2028:未解析的令牌(0A000032)“枚举STATUS __clrcall xyz(unsigned char)“(?xyz @@ $$ FYM?AW4STATUS @@ E @ Z)在 功能 __catch $?button3_Click @ Form1中@ @@ MYAPP $$ FA $ $ AAMXP @ AAVObject系统@@ P $ AAVEventArgs @ @@ 4 Z $ 0
但我应该为控制台和Windows应用程序使用相同的静态库。
答案 0 :(得分:4)
链接器错误消息强烈暗示它出错了什么。注意未定义符号的__clrcall
调用约定,它告诉您编译器认为这些是“CLR”函数。托管代码,当然不是,它们是__cdecl。还有更多,这些名字也被破坏了。请注意名称中的“@@ $$ FYM?AW4STATUS @@ E @ Z”诅咒。这告诉你编译器认为它们是用C ++而不是C语言编写的。
你必须明确告诉编译器这个,.h文件不够兼容。您在C ++ / CLI源代码文件中的确如此:
#pragma managed(push, off)
extern "C" {
#include "yadayada.h"
}
#pragma managed(pop)
#pragmas暂时关闭托管代码编译模式,因此编译器现在假定这些是非托管函数声明。围绕#include的extern“C”{}告诉编译器.h文件包含C声明。