Есть простой сишный код:
Компилируем в IR:
Компилируем IR в BC:
Пробуем собрать в EXE'шник под х86 таргет на х64 хосте:
Получаем ошибку линковки
Проверяем флаги, переданные компилем линковщику:
Все пути указаны верно:
Если попробовать собрать под тот же таргет что и хост:
Всё ок, получаем х64 бинарник.
Если попробовать собрать исходник:
Всё ок, получаем х32 бинарник.
Но почему же не получается собрать байткод под другой таргет? Байткод не поддерживает кросскомпиляцию?
C:
#include <windows.h>
int main() {
MessageBoxW(0, 0, 0, 0);
}
clang -S -emit-llvm test.cppКомпилируем IR в BC:
opt test.ll -o test.bcПробуем собрать в EXE'шник под х86 таргет на х64 хосте:
clang-cl test.bc -m32 /MT /link kernel32.lib libcmt.lib user32.libПолучаем ошибку линковки
error LNK2019: unresolved external symbol __imp__MessageBoxW referenced in function _mainПроверяем флаги, переданные компилем линковщику:
clang-cl test.bc -v -m32 /MT /link kernel32.lib libcmt.lib user32.libВсе пути указаны верно:
Код:
link.exe \
"-libpath:C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.34.31933\\lib\\x86" \
"-libpath:C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.34.31933\\atlmfc\\lib\\x86" \
"-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.22621.0\\ucrt\\x86" \
"-libpath:C:\\Program Files (x86)\\Windows Kits\\10\\Lib\\10.0.22621.0\\um\\x86" \
...
clang-cl test.bc /MT /link kernel32.lib libcmt.lib user32.libВсё ок, получаем х64 бинарник.
Если попробовать собрать исходник:
clang-cl test.cpp /MT -m32 /link kernel32.lib libcmt.lib user32.libВсё ок, получаем х32 бинарник.
Но почему же не получается собрать байткод под другой таргет? Байткод не поддерживает кросскомпиляцию?