民间,
我刚刚创建了我的第一个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 ++编译器的经验很少,因此我不知道我在链接器设置中寻找什么。
任何帮助都会得到很好的接受。
由于
答案 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。这对我有用。