Файл lspcommon.h является частью примера LSP, вы должны быть в состоянии найти его в подпапке «common». (C: \ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Samples \ netds \ winsock \ lsp \ common)
Если вы дважды щелкнете по одной из ваших ошибок, редактор откроется, сосредоточившись на строке, которая вызывает проблемы. Сделайте это для lspdef.h, строка 22, и вы увидите, что код выглядит следующим образом ...
#ifndef _PSDK_BLD
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#endif
Это означает, что файл nt.h (и два других) включается, только если макрос _PSDK_BLD не определен. Посмотрите немного ниже на строку 35, и вы увидите, что код выглядит следующим образом ...
#ifndef _PSDK_BLD
#include <lspcommon.h>
#else
#include "..\common\lspcommon.h"
#endif
В этом случае, если макрос не определен, код включает файл lspcommon.h, но если макрос определен , то код включает файл lspcommon.h из общего фойдера.
Вполне вероятно, что ваши проблемы возникают из-за того, что _PSDK_BLD не определен. Из стиля #ifdef не похоже, что макрос должен быть определен для какого-то определенного значения, только что определенного.
В Visual Studio перейдите в Свойства проекта, перейдите к C / C ++ и затем Препроцессор. Затем найдите строку определений препроцессора и щелкните по значению. Теперь выберите edit и добавьте _PSDK_BLD в список определений препроцессора.
Следите за этим главным подчеркиванием и не забудьте внести изменения в конфигурации отладки и выпуска (и для всех платформ, которые вы, возможно, определили)
Ошибка LNK2005 означает, что компоновщик нашел два определения для объекта, который он пытается связать - что является проблемой, поскольку у компоновщика нет возможности определить, какое из двух определений он следует использовать.
В данном конкретном случае объект, который пытается разрешить компоновщик, - это "struct _GUID gProviderGuid". Если вы посмотрите в файлах instlsp.h, lspdef.h (оба) и lspcommon.h, вы увидите код, похожий на этот
extern GUID gProviderGuid;
Это объявляет внешнюю переменную с именем gProviderGuid типа GUID (которая является структурой). Компоновщик должен разрешить эту внешнюю ссылку в любом файле, который включает один из этих заголовочных файлов, а затем сделал ссылку на gProviderGuid.
Из части ошибки «уже определено в lspguid.obj» мы знаем, что компоновщик заглянул внутрь файла lspguid.obj и нашел определение gProviderGuid. Конечно, если мы заглянем внутрь lspguid.cpp, то увидим определение gProviderGuid со значением, начинающимся с 0xc5fabbd0.
Из той же ошибки "C: \ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ Samples \ netds \ winsock \ lsp \ instlsp.obj" мы знаем, что компоновщик также заглянул внутрь файла instlsp .obj и нашел второе определение gProviderGuid. Если мы заглянем внутрь intlsp.cpp, то увидим другое определение gProviderGuid (на этот раз без какого-либо значения).
Проблема в том, что компоновщик ищет и в lspguid.obj, и в intlsp.obj и находит противоречивые определения gProviderGuid.
Эти два файла не должны быть частью одной сборки, поэтому мы не должны ожидать, что один запуск компоновщика прочитает их оба одновременно.
Проект LSP состоит из четырех частей: lspcommon, который используется для генерации статической библиотеки lspcommon.lib; ifslsp, который используется для генерации файла ifslsp.dll; nonifslsp, который используется для генерации файла nonifslsp.dll, и установка, которая используется для генерации файла Instlsp.exe. См. Файл readme.txt в lsp и файлы makefile в различных папках для получения дополнительной информации.
Если вы собираетесь создавать LSP внутри Visual Studio, вам действительно нужно четыре разных проекта в своем решении, по одному для lspcommon, ifslsp, nonifslsp и install.