首先,我是C ++(和MS VS)的新手,所以我很可能在这里缺少一些东西。不过,我确实有一定的编码经验,并且在辨别可能逃脱我的方法时遇到了麻烦。
我正在尝试通过以下代码使用Logitech提供的.lib和.h文件来控制G13键盘:
[编辑:此代码和错误消息已进行了更改,以考虑到Mike Vine和Hans Passant的以下要点(谢谢!),但问题仍然存在]
#include "pch.h"
#include <iostream>
#pragma comment(lib,"LogitechLCDLib")
#include "Include\LogitechLCDLib.h"
int main()
{
wchar_t str[] = L"Hello";
LogiLcdInit(str, 1);
return 0;
}
但是,我收到以下错误;
Error LNK2019 unresolved external symbol "bool __cdecl LogiLcdInit(wchar_t *,int)" (?LogiLcdInit@@YA_NPAGH@Z) referenced in function _main ConsoleApplication1 C:\Users\clewl\source\repos\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.obj 1
Error LNK1120 1 unresolved externals ConsoleApplication1 C:\Users\clewl\source\repos\ConsoleApplication1\Debug\ConsoleApplication1.exe 1
我在这里待了一会儿-我起初虽然在wchar_t *上做错了什么(它对我来说是新的,在const正确性方面也是如此),然后由于某种原因,.lib不是'不会被加载。
但是,我现在发现了/ VERBOSE的奇迹(告诉您我是Visual Studio的新手;-)),并且一直在将我的代码输出与Logitech SDK提供的(有效)示例进行比较。 / p>
我可以肯定地确定.h是正确的,因为intellisense显示了定义,并且.lib文件已正确拾取,因为详细的构建输出显示了诸如以下的行
1>Starting pass 1
1>Processed /DEFAULTLIB:LogitechLCDLib
<snip>
1> Searching C:\Users\clewl\source\repos\ConsoleApplication1\ConsoleApplication1\Lib\x64\LogitechLCDLib.lib:
但是,在构建输出的最后是
1> Unused libraries:
<snip>
1> C:\Users\clewl\source\repos\ConsoleApplication1\ConsoleApplication1\Lib\x64\LogitechLCDLib.lib
当我将其与工作示例的构建输出进行比较时,我看到诸如
1> Processed /DEFAULTLIB:LogitechLCDLib.lib
<snip>
1> LogitechLCDLib.lib(LogitechLCDLib.obj)
1> LogitechLCDLib.lib(stdafx.obj)
<snip>
1> Searching ..\..\Lib\x86\LogitechLCDLib.lib:
1> Found "bool __cdecl LogiLcdInit(wchar_t *,int)" (?LogiLcdInit@@YA_NPA_WH@Z)
1> Referenced in LCDDemoDlg.obj
1> Loaded LogitechLCDLib.lib(LogitechLCDLib.obj)
1> Found ___@@_PchSym_@00@UyfrowztvmgUdlipUyIzCIHuEBIJHIIFJUhixUhwphUoxwUoltrgvxsoxworyUivovzhvUhgwzucOlyq@9DC0ED7C20F9DB3D
1> Referenced in LogitechLCDLib.lib(LogitechLCDLib.obj)
1> Loaded LogitechLCDLib.lib(stdafx.obj)
除其他外,没有提及LogitechLCDLib.lib是未使用的库。
不幸的是,经过相当密集的几天,我的google fu似乎已经放弃了我,并且我无法继续前进。有很多此链接器错误的示例,但似乎没有一个可以解决这种情况-不正确的/ NODEFAUTLIB,或者(仅在我可以使用此库的情况下),仅移动#pragma注释行即可。
因此,在您的专业知识和经验面前,我深信不疑!如果你们中的任何人都可以告诉我我犯了什么严重错误,或者我缺少基本概念,我将非常感激。
我有点犹豫要发布完整的详细日志,但是如果需要任何进一步的信息,我将非常乐意提供。
TL; DR-认为自己可以编码的Bloke不能执行基本任务,但是过得很好,问得很好。 ;-)
感谢您的阅读!
尼尔
答案 0 :(得分:2)
您需要确保如代码段所示使用/Zc:wchar_t
进行编译:
bool __cdecl LogiLcdInit(unsigned short *,int)
这认为LogiLcdInit
的第一个参数是unsigned int
,而在工作版本中:
bool __cdecl LogiLcdInit(wchar_t *,int)
您可以正确地看到它的wchar_t
。现在/Zc:wchar_t
应该默认处于启用状态,但是无论出于何种原因它都不适合您。如果未打开,则可以在“属性-> C / C ++->语言->将wchar_t视为内置类型”中找到它
有关更多信息,请参见this page。