C++/CLI:链接器给出“未解析的令牌” 对于win32函数
各位,
我刚刚创建了我的第一个 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
检查链接器命令行中是否存在 Gdi32.lib(属性 > 链接器 > 命令行)。
(就是这样——你已经成功地吸引了我灵魂中自私、寻求名声的部分;))
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 ;) )
您应该将您的 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.
线索就在函数声明的 __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.