Неразрешенные внешние символы при компиляции 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.

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