2

伙计们,

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

当从 C# exe 调用时,我的库构建良好,并且琐碎的函数可以正常工作。

但是,一旦我包含 WinGDI 调用(在本例中为DeleteObject),链接器就会抱怨“未解析的令牌”错误。

错误 2 错误 LNK2028:未解析的令牌 (0A000088) "extern "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++ 编译器的经验也很少,因此我不知道我在链接器设置中寻找什么。

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

谢谢

4

3 回答 3

7

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

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

(你去——你已经成功地吸引了我自私、寻求代表的灵魂;))

于 2009-04-11T12:28:17.687 回答
3

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

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

于 2009-04-11T12:22:18.123 回答
2

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

于 2011-10-24T13:32:19.143 回答