Я хочу связать test.ll
а также libstdc++.a
в окне ОС.
У меня есть простой тестовый код IR, как это.
@.str = internal constant [14 x i8] c"hello, world\0A\00"
declare i32 @printf(i8*, ...)
define i32 @main(i32 %argc, i8** %argv) nounwind {
entry:
%tmp1 = getelementptr [14 x i8], [14 x i8]* @.str, i32 0, i32 0
%tmp2 = call i32 (i8*, ...) @printf( i8* %tmp1 ) nounwind
ret i32 0
}
Я успешно скомпилировал test.ll
в test.obj
с llc
,
Теперь я хочу сделать test.exe
файл с lld
не GCC, кл
Я попробовал эту команду, но у меня ничего не вышло …
lld -flavor link /entry:main /implib:libstdc++.a test.obj
Верните это.
test.obj: undefined symbol: printf
error: link failed
Моя версия LLVM 4.0.0, lld версия 4.0.0
Я должен использовать GCC? Помоги мне, пожалуйста. Спасибо.
printf
не предоставляется libstdc++
, вам нужно сделать ссылку на стандартную библиотеку C, такую как msvcrt.
/entry:main
не нужно, так как main
будет вызван крит.
/implib
это не тот вариант, который вы ищете. Указывает имя импортируемой библиотеки в генерировать.
С помощью g++ test.obj
успешно связывает ваши test.obj
(создано с clang-cl -c test.ll
) к mingw-w64-crt и создает работоспособную программу.
clang++ test.ll
(это mingw-w64 clang в msys2) делает то же самое.
Вы можете проверить вызов с -v
выяснить, какие объекты и библиотеки были связаны.
Вы также можете сослаться на статический майкрософт элт с:
clang-cl -fuse-ld=lld-link test.ll libcmt.lib
В настоящее время не используется lld с clang-cl (LLVM 4.0), похоже, не работает.
Использование gcc будет работать, но у lld есть опция -lc
который говорит, что это ссылка на стандартную библиотеку c ++. Возможно, вам придется бросить -flavour link
вариант и идти с интерфейсом в стиле Unixy, хотя.