Неразрешенные внешние символы при компиляции 32-битного приложения в Windows 64
Поэтому я пытаюсь скомпилировать унаследованное приложение из 32-битного в 64-битное. Я перекомпилировал все используемые им библиотеки и сделал так, чтобы он смотрел на WIN SDK6.0A x64 bit для библиотек..
Я использую:
- Visual Studio Professional Edition 2008
- Visual C++
- dotNet Framework 3.5 SP1
- Windows Server 2008R2
- Windows SDK 6.0A
В конце концов все происходит, но я получаю эти странные неопределенные ошибки символов:
error LNK2019: unresolved external symbol InterlockedDecrement referenced in function ...
error LNK2019: unresolved external symbol InterlockedIncrement referenced in function ...
error LNK2019: unresolved external symbol GetModuleBaseName referenced in ...
error LNK2019: unresolved external symbol EnumProcessModules referenced in ...
error LNK2019: unresolved external symbol EnumProcesses referenced in ...
error LNK2019: unresolved external symbol GetProcessMemoryInfo referenced
Проблема в том, что это все выигрышные вещи из SDK. InterlockedDec и InterlockedInc поступают из kernel32.lib GetModuleBaseName, EnumProcessModules, EnumProcesses,GetProcessMemoryInfo находятся в psapi.h, но также и kernel32.lib или psapi.lib
Я проверил C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64, и там есть обе библиотеки libs kernel32.lib и psapi.lib.
Это определенно смотрит на libs в правильном месте. Я включил /VERBOSE:LIB, и он указывает на правильную папку.
Поэтому я действительно смущен, почему он не находит их.
Есть идеи???
Спасибо
5 ответов
Так что я наконец-то понял это, вроде как... Он не нашел psapi.lib
В Project->Linker-> Дополнительные зависимости вместо того, чтобы просто сказать psapi.lib, я дал полный путь к нему, и он работал... не совсем уверен, почему он не смог найти его раньше, ну да ладно...
Это очень длинный выстрел (и я действительно не верю, что это так), но, возможно, заголовки не защищены должным образом с помощью extern "C" для компиляции C++? Вы включаете системные заголовки или просто объявляете функции самостоятельно?
Можете ли вы опубликовать свои командные строки компиляции и линковки, а также любые #def в вашем коде?
Это происходит, если вы делаете простой проект с нуля, который вызывает только один из этих методов?
Для записи: та же проблема, другое решение; У меня была запись для каталога
psapi
добавлен в список
Linker/General/Additional Library Directory
Это привело к использованию старой платформы VS2005 sdk psapi.lib (он имел только x86, без версии x64). После удаления записи теперь используется правильный lib из установленного WinSDK x64/psapi.lib. Так что следите за микшированием / заказом старых и новых SDK! Очевидно, что полный путь также будет работать, но может быть проблемой, когда вы используете проект на нескольких машинах.
В моем случае (переход с VS2008 на VS2012) проблема была решена после добавления psapi.lib в Linker->input->Additional Dependencies в VS 2012.