Ошибка 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 как встроенный тип"

Смотрите эту страницу для получения дополнительной информации.

Другие вопросы по тегам