C ++ / CLI:链接器为win32函数提供“未解析的令牌”

时间:2009-04-11 12:09:32

标签: .net visual-studio c++-cli

民间,

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

我的库构建良好,并且从C#exe调用时可以使用简单的函数。

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

  

错误2错误LNK2028:未解决   token(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 ++编译器的经验很少,因此我不知道我在链接器设置中寻找什么。

任何帮助都会得到很好的接受。

由于

3 个答案:

答案 0 :(得分:6)

  

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

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

(你去了 - 你成功地吸引了我的自私,寻求灵魂的一部分;)

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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