Попытка скомпилировать Detours.lib как 32-битную на 64-битной машине: LNK1112: тип машины модуля 'x86' конфликтует с типом целевой машины 'x64' - PullRequest
1 голос
/ 05 мая 2020

Пытаюсь скомпилировать обходы по инструкции. Я бы хотел скомпилировать 32-битные версии библиотеки, так как планирую подключить 32-битное приложение. Я искал ответы в Google, но они, кажется, объясняют очевидное, например, переход на 64-разрядную версию, но я собираюсь компилировать для 32-разрядной версии.

Я использовал сочетание следующих команд, пытаясь получить это для работы:

SET DETOURS_TARGET_PROCESSOR=X86
CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat"  x86
CALL "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars32.bat"
NMAKE

Однако это приводит к следующим ошибкам:

1) Во время VCVARSALL:

[ERROR:team_explorer.bat] Directory not found : "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer"
[vcvarsall.bat] Environment initialized for: 'x86'

2) Во время NMAKE

LIBCMT.lib(chkstk.obj) : fatal error LNK1112: module machine type 'x86' conflicts with target machine type 'x64'

Как видите, несмотря на все мои усилия, он жалуется на тип целевой машины.

Я также пробовал vcvarsall x64 в паре с SET DETOURS_TARGET_PROCESSOR = X86. (Не уверен, что это действительный тест) Результатом стало

iping_d.obj : error LNK2001: unresolved external symbol iping_ProxyFileInfo

Пожалуйста, помогите мне понять, что я делаю неправильно.

Когда я выбираю DETOURS_TARGET_PROCESSOR = X64, он компилируется успешно, но создает 64-битную библиотеку, которую я не могу использовать в моей 32-битной dll.

Я также пробовал все это из V C Командная строка собственных инструментов x86 с теми же результатами.

1 Ответ

1 голос
/ 21 августа 2020

Я написал ответ на этот вопрос в системе отслеживания ошибок, здесь: https://github.com/microsoft/Detours/issues/98.

Публикуем содержимое здесь для удобства:

Я думаю, проблема в том, что вы используете неправильную конфигурацию для кросс-компиляции. Для кросс-компиляции двоичных файлов x86 на хосте x64 вам необходимо:

  • Запустить командную строку «x64_x86 Cross Tools Command for VS».
  • установить DETOURS_TARGET_PROCESSOR = X86

Я думаю, вы могли случайно запустить командную строку «x86_x64 Cross Tools Command Prompt for VS». Если я сделаю это, а затем установлю DETOURS_TARGET_PROCESSOR = X86, я могу воспроизвести ту же ошибку. Я предполагаю, что то же самое произошло бы, если бы я сделал обратную кросс-компиляцию для X64.

Именование очень запутанное, но вы можете легко проверить, проверив переменные среды, которые установлены в командной строке.

x64_x86 Командная строка Cross Tools:

C:\>set | findstr VSCMD_ARG
VSCMD_ARG_app_plat=Desktop
VSCMD_ARG_HOST_ARCH=x64
VSCMD_ARG_TGT_ARCH=x86

Примечание: VSCMD_ARGT_TGT_ARCH соответствует архитектуре, на которую мы ориентируемся, и должно быть равно DETOURS_TARGET_PROCESSOR.

x86_x64 Cross Командная строка инструментов:

C:\>set | findstr VSCMD_ARG
VSCMD_ARG_app_plat=Desktop
VSCMD_ARG_HOST_ARCH=x86
VSCMD_ARG_TGT_ARCH=x64

Здесь мы видим, что значения инвертированы по сравнению с тем, что мы хотим.

...