как связать libstdc ++, используя llvm lld

Я хочу связать 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? Помоги мне, пожалуйста. Спасибо.

0

Решение

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), похоже, не работает.

0

Другие решения

Использование gcc будет работать, но у lld есть опция -lc который говорит, что это ссылка на стандартную библиотеку c ++. Возможно, вам придется бросить -flavour link вариант и идти с интерфейсом в стиле Unixy, хотя.

-1

По вопросам рекламы [email protected]