Ошибка LNK2019 при использовании комментария #pragma, запутанная выводом / VERBOSE - PullRequest
0 голосов
/ 28 августа 2018

Во-первых, я новичок в C ++ (и MS VS), поэтому я, скорее всего, что-то здесь упускаю. Однако у меня есть некоторый опыт написания кода, и мне трудно понять, что может ускользнуть от меня.

Я пытаюсь использовать предоставленные Logitech файлы .lib и .h для управления клавиатурой G13, используя следующий код:

[Редактировать: этот код и сообщения об ошибках были изменены, чтобы учесть приведенные ниже моменты от Майка Вайна и Ханса Пассанта (спасибо, ребята!), Но проблема все еще остается]

#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 * (это было для меня новым, так как это было правильно), а потом, по какой-то причине, .lib не был ' загружается.

Однако теперь я обнаружил чудеса / VERBOSE (сказал, что я новичок в Visual Studio ;-)) и сравнивал вывод моего кода с (рабочим) примером, поставляемым с Logitech SDK.

Я вполне уверен, что .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, который является неиспользуемой библиотекой.

К сожалению, после довольно напряженной пары дней мой гугл-фу, похоже, разочаровался во мне, и я не могу прогрессировать дальше. Есть много примеров этой ошибки компоновщика, но ни один из них, похоже, не исправляет этот случай - неверный / NODEFAUTLIB или (как в единственном случае, который я могу найти с помощью этой библиотеки), просто перемещая строку комментария #pragma.

И поэтому я бросаюсь перед вашими превосходящими знаниями и опытом! Если бы кто-нибудь из вас, добрые люди, мог сказать мне, какую вопиющую ошибку я совершаю, или какую фундаментальную концепцию я пропускаю, я был бы очень благодарен.

Я немного не решаюсь публиковать полные подробные журналы, но если потребуется какая-либо дополнительная информация, я буду более чем рад предоставить ее.

TL; DR - Блок, который думает, что умеет кодировать, не может выполнять базовые задачи, но хорошо выполнил задание и очень мило спросил. ; -)

Спасибо за чтение!

Neal

1 Ответ

0 голосов
/ 28 августа 2018

Вы должны убедиться, что вы компилируете с /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 как встроенный тип»

Подробнее см. на этой странице .

...