Сбой компиляции при EnableABIBreakingChecks - PullRequest
0 голосов
/ 16 декабря 2018

Я недавно установил LLVM v8.0.0 (на RHEL 7.4).Я изучаю учебник по калейдоскопу LLVM *1002*, чтобы узнать, как пользоваться системой, но сталкиваюсь с проблемой связывания.

В соответствии с учебником ( конец главы 2 ), Я запускаю:

clang++ -g -O3 kld.cpp `llvm-config --cxxflags` -o kld

Компилируется, но компоновщик не работает:

/tmp/kld-f7264f.o:(.data+0x0): undefined reference to `llvm::EnableABIBreakingChecks'
clang-8: error: linker command failed with exit code 1 (use -v to see invocation)

Я подозревал, что это может быть проблема с llvm-config, поэтому я также попытался использоватьфлаги --ldflags и --system-libs, но не повезло.

llvm-config --cxxflags дает (переформатирован для удобства чтения)

-I~/project/llvm-src/include -I~/project/llvm-build/include 
-fPIC -fvisibility-inlines-hidden
-std=c++11
-Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual
-Wno-missing-field-initializers -pedantic -Wno-long-long
-Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment
-g 
-fno-exceptions -fno-rtti
-D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS

Где ~/... - это просто путь к моему домашнему каталогу(отредактировано для конфиденциальности; фактический вывод - полный путь).Я работаю в общей системе, которая требует локальной установки нового программного обеспечения.

Код учебника никогда не ссылается на ABI явно, поэтому я предполагаю, что это должно быть какой-то проблемой с флагами компилятора.grep для отсутствующего символа в недвоичных файлах дает объявление extern в include/llvm/Config/abi-breaking.h и реальное объявление в lib/Support/Error.cpp:

#if LLVM_ENABLE_ABI_BREAKING_CHECKS
int EnableABIBreakingChecks;
#else
int DisableABIBreakingChecks;
#endif

Я думал, что попробую перекомпилировать,затем с -DLLVM_ENABLE_ABI_BREAKING_CHECKS.Это также делает эту работу.

Я не совсем понимаю, что в первую очередь делают проверки взлома ABI, и это может быть намного выше моего уровня комфорта C ++.Но как я могу заставить эту ошибку замолчать, если мне не нужна упомянутая функциональность;или исправить, если я это сделаю?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Основано на обсуждении в irv канале llvm.

Для компиляции используйте следующую команду: clang ++ -O3 -c $ (llvm-config --cxxflags) source_file.cpp -o obj_code.

Затем попробуйте выполнить соединение с помощью этой команды: clang ++ obj_code $(llvm-config --ldflags --libs) -lpthread.

Я думаю, что связывающая часть не упоминается в разделе калейдоскопа.Вышеуказанное решение сработало для меня.

0 голосов
/ 18 декабря 2018

Оказывается, что ответ был скрыт в abi-breaking.h:

/* Allow selectively disabling link-time mismatch checking so that header-only
   ADT content from LLVM can be used without linking libSupport. */
#if !LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING

Я не уверен, что мне понадобится libSupport, но компиляция с LLVM_DISABLE_ABI_BREAKING_CHECKS_ENFORCING=1 пока работает.

...