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

标签 c++ c visual-studio static-libraries windows-forms-designer

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

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

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

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

出现这样的错误

error LNK2028: unresolved token (0A000032) "enum STATUS __clrcall xyz(unsigned char)" (?xyz@@$$FYM?AW4STATUS@@E@Z) referenced in function __catch$?button3_Click@Form1@Myapp@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z$0

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

最佳答案

链接器错误消息强烈提示出了什么问题。请注意 undefined symbol 的 __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 暂时关闭托管代码编译模式,因此编译器现在将假设这些是非托管函数声明。 extern "C"{} 环绕 #include 告诉编译器 .h 文件包含 C 声明。

关于c++ - 如何在 Windows 窗体应用程序 vc++ 中导入 C 静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21873310/

相关文章:

c# - 如何在 C++ 中读取 IL

c - execv() 在传递 ( char * ) 而不是 ( char * const ) 时不起作用

c - 为什么我的链表修改在此 C 代码中不起作用?

c - 如何在 Sublime Text 3 中添加 gtk 为 C 程序创建图形用户界面

visual-studio - 如何在Visual Studio 2008/2010中为调试asp.net切换默认浏览器?

vb.net - 使用什么语言

visual-studio - VB Express 2008(专业版)和 2010 之间的主要区别是什么?

c++ - 在 Visual Studio Code 2017 中 : msbuild : The term 'msbuild' is not recognized as the name of a cmdlet

c++ - OpenGL - 当我从一个单元格移动到另一个单元格时,相机移动有一个闩锁

c++ - OpenThread() 返回 NULL Win32