Недавно я был назначен на проект C ++, хотя я не разработчик C ++. Мне предоставили Visual Studio 2010 Professional в качестве IDE. Так что я дал ему шанс.
Я должен написать динамическую библиотеку c ++ (* .dll), которая обертывает две статические библиотеки (* .lib). Статические библиотеки — это сторонние библиотеки, которые мы купили пару лет назад у другой компании. С использованием dumpbin /header ...
Вызов cmd, могу сказать, что обе статические библиотеки имеют следующее значение заголовка файла:
14C machine (x86)
Я получил эту задачу, работая на платформе решения Win32. Я добавил заголовочные файлы и библиотеки в проект. Библиотеки включены, написав два #pragma comment(lib, ...)
операторы в .cpp мне нужны функции в. Работает как шарм. Пример функции выглядит так:
extern "C" void OURFreeStringBuf(Cm_StringBuf *sbuf)
{
FreeStringBuf(sbuf); // the call to the static library
}
Эта динамическая библиотека также должна использоваться в архитектурах x64. Поэтому я попытался установить платформу решения на x64. Теперь я получаю следующую ошибку для каждого вызова одной из функций статических библиотек (никаких изменений кода или других изменений конфигурации не было сделано):
error LNK2001: unresolved external symbol "..."
с последующей ошибкой суммирования:
error LNK1120: 29 unresolved external links
Могут ли эти ошибки быть результатом попытки связать файлы x86 lib в dll x64? Есть ли шанс выполнить эту задачу, используя предоставленные статические библиотеки?
Заранее большое спасибо.
Вы не можете — другими словами, НЕТ СПОСОБА — связать 32-битную библиотеку с 64-битным исполняемым файлом или DLL (или 32-битным исполняемым файлом с 64-битной DLL или наоборот). Вам придется либо скомпилировать ваш .DLL / .EXE как 32-битный, либо найти 64-битную версию 32-битной библиотеки. Нет другого решения!
64-разрядная архитектура отличается от 32-разрядной архитектуры в нескольких аспектах, но самое главное, что адреса (указатели) являются 64-разрядными в 64-разрядной архитектуре, что препятствует правильной работе почти любого 32-разрядного кода в 64-битная среда (потому что старшие 32 бита адресов потеряны, что не дает ничего значимого).
Других решений пока нет …