Я использовал библиотеку ITK .Когда я написал пример программы с использованием этой библиотеки, я обнаружил следующие ошибки компоновщика.Как мы видим, все эти «неразрешенные» символы являются функциями Windows API, и эти функции Windows API использовались библиотекой ITK, а не моей программой.
Error 1 error LNK2019: unresolved external symbol _SnmpUtilVarBindFree@4 referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" (?GetMacAddrSys@gdcm@@YAHPAE@Z) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error 2 error LNK2019: unresolved external symbol _SnmpUtilOidNCmp@12 referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" (?GetMacAddrSys@gdcm@@YAHPAE@Z) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error 3 error LNK2019: unresolved external symbol _SnmpUtilOidCpy@8 referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" (?GetMacAddrSys@gdcm@@YAHPAE@Z) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error 4 error LNK2019: unresolved external symbol _WSAStartup@8 referenced in function "int __cdecl gdcm::GetMacAddrSys(unsigned char *)" (?GetMacAddrSys@gdcm@@YAHPAE@Z) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error 5 error LNK2019: unresolved external symbol __imp__UuidCreate@4 referenced in function "private: static bool __cdecl gdcm::Util::GenerateUUID(unsigned char *)" (?GenerateUUID@Util@gdcm@@CA_NPAE@Z) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error 6 error LNK2019: unresolved external symbol _gethostbyname@4 referenced in function "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl gdcm::Util::GetIPAddress(void)" (?GetIPAddress@Util@gdcm@@CA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error 7 error LNK2019: unresolved external symbol _gethostname@8 referenced in function "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl gdcm::Util::GetIPAddress(void)" (?GetIPAddress@Util@gdcm@@CA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Error 8 error LNK2019: unresolved external symbol _WSACleanup@0 referenced in function "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl gdcm::Util::GetIPAddress(void)" (?GetIPAddress@Util@gdcm@@CA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) C:\Projects\sampleProject\bin\itkgdcm.lib(gdcmUtil.obj)
Эти ошибки вызвали у меня несколько вопросов.Для некоторых из них, я думаю, я знаю ответы, но мне нужно подтверждение, если я прав или нет.
Эти функции Windows API используются в gdcmUtil.cpp (потому что там написано gdcmUtil.OBJ).Итак, компилятор компилирует gdcmUtil.cpp в (скажем) gdcmUtil.asm и ассемблер собирает его в gdcmUtil.obj.Поскольку при компиляции библиотеки мы не генерируем exe-файлы.Эти * .obj файлы не связаны с другими * .obj.Таким образом, символы Windows API все еще являются внешними символами для этого модуля и, таким образом, остаются нерешенными.Правильно?
Кто создает файл * .LIB?Я имею в виду, что компилятор генерирует файл * .s, а Assembler генерирует файл * .obj, и мы не используем компоновщик.Итак, откуда мы взяли файл * .lib?Кто упаковал все файлы * .obj в файл * .lib?
Как компилируются приложения Windows API (программы, написанные на C и использующие Windows API)?Я имею в виду, потому что это автономные приложения, как разрешаются эти символы WIN32 API?Предполагая, что я написал такую программу, кто-нибудь может сказать мне, что мне нужно для успешной сборки приложения?
Я знаю, что Windows API реализован в kernel32.dll, gdi32.dll, user32.dll (которая, в свою очередь, может импортировать некоторые другие dll, такие как wsock32.dll для сетевого API и т. д.), но вопрос в том, как использовать эти функции в функциях Windows API в программе на Си.Я имею в виду, как динамически связываться с этими DLL
В моем стремлении найти ответ на мою проблему ошибок компоновщика.Я обнаружил, что должен добавить wsock32.lib (для WinSock 1.1) или ws2_32.lib (для WinSock 2) или snmpapi.lib к входу компоновщика.
- С каких пор Windows API статически связан?
- С каких пор Windows API поставляется в статических библиотеках (* .lib файлы)?
- В каком каталоге я могу найти все эти странные файлы * .lib?
Теперь, есть ли альтернативное решение, кроме добавления файлов * .lib ввходные файлы компоновщика?потому что когда я использую новую библиотечную функцию ITK, я получаю новую ошибку компоновщика.Я должен найти в Google, к какому файлу * .lib относится этот конкретный символ (оконная функция API), и добавить этот файл * .lib к моему входу компоновщика.Это сводит меня с ума!Есть ли вменяемый способ?