如何在 windows 窗体应用程序 vc++ 中导入 C 静态库

ary*_*rya 3 c c++ static-libraries windows-forms-designer visual-studio

我使用 VS 创建了一个静态“C”库。

我正在为另一个 VS 控制台 C 应用程序使用相同的库文件,它工作正常,但是当我使用 Windows 窗体应用程序时,它无法正常工作。

在这个论坛中提到了很多问题,但没有得到帮助。

是否有任何命名约定可以从 Windows 窗体 Managed c++ 调用静态库函数?

得到这样的错误

错误 LNK2028:未解析的令牌 (0A000032)“enum STATUS __clrcall xyz(unsigned char)”(?xyz@@$$FYM?AW4STATUS@@E@Z) 在函数 __catch$?button3_Click@Form1@Myapp@@$$FA 中引用$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z$0

但是我应该为控制台和 Windows 应用程序使用相同的静态库。

Han*_*ant 5

链接器错误消息强烈暗示出了什么问题。请注意__clrcall未定义符号的调用约定,它告诉您编译器认为这些是“CLR”函数。托管代码,当然不是,它们是__cdecl。还有更多,名字也乱了。请注意名称中的“@@$$FYM?AW4STATUS@@E@Z”诅咒。这告诉您编译器认为它们是用 C++ 而不是 C 编写的。

您必须明确地告诉编译器这一点,.h 文件不够兼容。您在 C++/CLI 源代码文件中这样做:

#pragma managed(push, off)
extern "C" {
#include "yadayada.h"
}
#pragma managed(pop)
Run Code Online (Sandbox Code Playgroud)

#pragmas 暂时关闭托管代码编译模式,因此编译器现在将假定这些是非托管函数声明。#include 周围的 extern "C" {} 告诉编译器 .h 文件包含 C 声明。

  • 这是另一个错误,在本地代码中链接时不要使用 /clr:pure。那不是纯粹的。 (2认同)