使用#pragma注释时出现LNK2019错误,与/ VERBOSE输出混淆

时间:2018-08-28 20:34:14

标签: c++ pragma lnk2019 .lib

首先,我是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不能执行基本任务,但是过得很好,问得很好。 ;-)

感谢您的阅读!

尼尔

1 个答案:

答案 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