У меня есть немного кода, который имеет следующую строку
#pragma comment(linker, "/include:_test@12")
Проект, который использует этот код, работает нормально, когда я компилирую код с использованием C ++ Visual Studio 2010 с типом конфигурации 32 бита (я также на 32-битной машине Windows).
Я получаю ошибку ссылки, когда меняю машину на 64-битную и использую конфигурацию x64, которая компилируется с C ++ Visual Studio 2010.
Отличается ли название C ++ от 32-битного или 64-битного? Если это так, где я могу найти 64-битные соглашения по каллиграфии имен C ++?
Да, искажение имени отличается от 32 до 64 бит. Разумная статья о точных форматах может быть нашел здесь. Вы можете заметить основные различия довольно быстро, однако, просто купите компиляцию для обеих целей и изучите полученные файлы карт. Из моего опыта они почти идентичный (64-битный добавляет небольшой элемент данных, потенциально изменяет другие).
Простой пример: void foo();
32bit: ?foo@A@@QAEXXZ
64bit: ?foo@A@@QEAAXXZ
Для не искаженного вызова std суффикс длины может существенно отличаться в зависимости от использования стека параметров. 64-битные настройки по умолчанию для VC ++ не ставят подчеркивания и не кодируют суффиксы длины. Следующее было скомпилировано как 32/64-битными конфигами с чистыми настройками:
extern "C" int _stdcall func2(int, int, char*);
32bit: _func2@12
64bit: func2
Там нет особого смысла.
Завершая схему, unmagled _cdecl, который делает это:
extern "C" int _cdecl func2(int, int, char*);
32bit: _func2
64bit: func2
Если кажется, что они старались изо всех сил сообщить вам, что вы загружаете или экспортируете, свидетельства предполагают, что вы, вероятно, правы.
Других решений пока нет …