C++/CLI:链接器给出“未解析的令牌” 对于win32函数

发布于 2024-07-17 22:31:55 字数 731 浏览 1 评论 0原文

各位,

我刚刚创建了我的第一个 C++/CLI 项目 (Visual Studio 2008),它是一个允许我的 C# 应用程序访问销售点理货打印机的库。

我的库构建良好,从 C# exe 调用时,一些简单的函数可以正常工作。

但是,一旦我包含 WinGDI 调用(DeleteObject 在这种情况下),链接器抱怨“未解析的令牌”错误。

错误 2 错误 LNK2028:未解决 令牌(0A000088)“外部“C”int __stdcall DeleteObject(void *)" (?DeleteObject@@$$J14YGHPAX@Z) 在函数“private: __clrcall ReceiptPrinter::Epson::~Epson(void)" (??1Epson@ReceiptPrinter@@$$FA$AAM@XZ) ReceiptPrinter.obj ReceiptPrinter

在过去的 4 年里我没有做过任何认真的 C++,而且我对 MS C++ 编译器的经验很少,因此我不'不知道我在链接器设置中寻找什么。

任何帮助都将受到极大的欢迎。

谢谢

Folks,

I just created my first C++/CLI project (Visual Studio 2008), it's a Library to allow my C# app access an point of sale tally printer.

My library builds well and trivial functions work when called from a C# exe.

However as soon as I include a WinGDI call (DeleteObject in this case), the linker complains with “unresolved token” errors.

Error 2 error LNK2028: unresolved
token (0A000088) "extern "C" int
__stdcall DeleteObject(void *)" (?DeleteObject@@$$J14YGHPAX@Z)
referenced in function "private:
__clrcall ReceiptPrinter::Epson::~Epson(void)"
(??1Epson@ReceiptPrinter@@$$FA$AAM@XZ) ReceiptPrinter.obj ReceiptPrinter

I haven't done any serious C++ in the last 4 years, and I have precious little experience of MS C++ compilers, as such I don’t know what I’m looking for in the linker settings.

Any help will be greatfully received.

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

灰色世界里的红玫瑰 2024-07-24 22:31:55

其他依赖项是“NoInherit”,当我在设置“下方”查看时,有一个库列表,gdi32.lib 在列表中。 我检查了“从父项目继承”,它现在可以工作了。 德克,如果您将所有这些添加为答案,我将选择它并给您代表。

检查链接器命令行中是否存在 Gdi32.lib(属性 > 链接器 > 命令行)。

(就是这样——你已经成功地吸引了我灵魂中自私、寻求名声的部分;))

Additional dependancies was "NoInherit", when I looked "under" the setting, there was a list of libs, gdi32.lib was in the list. I checked "Inherit from parent project" and it now works. Dirk, if you add all that as an answer I'll select it and give you the rep.

Check if Gdi32.lib is there in the linker commandline(Properties > Linker > CommandLine).

(There you go -- you have successfully appealed to the my selfish, rep seeking part of soul ;) )

以可爱出名 2024-07-24 22:31:55

您应该将您的 dll 与 Gdi32.lib 链接。

您可以使用 #pragma comment(lib, "gdi32.lib") 或在链接器下的项目设置中执行此操作。

You should link your dll with Gdi32.lib.

You can either do it with a #pragma comment(lib, "gdi32.lib") or in your project's settings under Linker.

隔岸观火 2024-07-24 22:31:55

线索就在函数声明的 __clrcall 修饰符中。 默认情况下,您的 Windows 窗体应用程序使用纯公共语言运行时代码和调用约定。 您链接到的外部库没有。 您需要将项目属性的“项目默认值”区域中的公共语言运行时支持设置从 /clr:pure 更改为 /clr。 这对我有用。

The clue is in the __clrcall modifier on the function declarations. Your Windows Forms app uses pure Common Language Runtime code and calling conventions by default. Your external library, which you're linking to, does not. You need to change the Common Language Runtime support setting in your Project Defaults area of the project properties from /clr:pure to /clr. That worked for me.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文