Ошибка LNK2019 при использовании комментария #pragma, запутанная выводом /VERBOSE
Во-первых, я новичок в 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* (это было для меня новым, как и в случае с правильностью const), а затем, по какой-то причине,.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 - Bloke, который думает, что он умеет кодировать, не может выполнять базовые задачи, но он хорошо поработал и очень мило спросил.;-)
Спасибо за прочтение!
Нил
1 ответ
Вы должны убедиться, что вы компилируете с /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 как встроенный тип"
Смотрите эту страницу для получения дополнительной информации.