Обычно я загружаю последнюю версию clang с их веб-сайта. Это помогает мне использовать последнюю версию C++, поскольку сделать это с помощью gcc на самом деле невозможно. Я просто получил бинарные файлы для моего Ubuntu/Debian, и я готов к работе.
Для меня линковка с библиотекой tsan
(библиотека дезинфицирующих потоков) никогда не была чем-то простым. Я использую безумные меры в cmake, чтобы заставить его работать. Раньше, когда я использовал gcc из системы, я делал это в cmake, чтобы ссылка работала корректно:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -ltsan")
set(CMAKE_LINK_LIBRARY_FLAG "-ltsan -l")
который в основном изменяет флаги связывания, чтобы связать каждую мелочь с tsan
. Какое-то время это работало нормально, но чтобы заставить это работать, я должен использовать gcc, системный компилятор. Если я попытаюсь связать вот так с clang 7, я получу segfault при запуске своей программы.
Итак, я искал доступные библиотеки tsan
, поставляемые с clang, и вот что я нашел:
user@machine:/opt/clang7$ find -iname "*tsan*"
./lib/clang/7.0.0/lib/linux/libclang_rt.tsan_cxx-x86_64.a
./lib/clang/7.0.0/lib/linux/libclang_rt.tsan-x86_64.a
./lib/clang/7.0.0/lib/linux/libclang_rt.tsan_cxx-x86_64.a.syms
./lib/clang/7.0.0/lib/linux/libclang_rt.tsan-x86_64.a.syms
./lib/clang/7.0.0/include/sanitizer/tsan_interface_atomic.h
./lib/clang/7.0.0/include/sanitizer/tsan_interface.h
Похоже, там есть библиотеки цана. Я думаю, я должен связать с ними. Как мне это сделать?
Это, похоже, не работает:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -L/opt/clang7/lib/clang/7.0.0/lib/linux/ -lclang_rt.tsan_cxx-x86_64")
set(CMAKE_LINK_LIBRARY_FLAG "-L/opt/clang7/lib/clang/7.0.0/lib/linux/ -lclang_rt.tsan_cxx-x86_64 -l")
Это тоже не работает:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -l:/opt/clang7/lib/clang/7.0.0/lib/linux/libclang_rt.tsan_cxx-x86_64.a")
set(CMAKE_LINK_LIBRARY_FLAG "-l:/opt/clang7/lib/clang/7.0.0/lib/linux/libclang_rt.tsan_cxx-x86_64.a -l")
Я пробовал несколько других комбинаций. Но ни один из них, похоже, не работает. Ошибки, которые я получаю, являются либо ошибками связывания, либо неопределенными ссылками на некоторые компоненты tsan.
Как я могу создать ссылку на tsan из готовых бинарных файлов новейшего clang?
this doesn't work either
? - person Matthieu Brucher   schedule 21.12.2018libtsan.so
, а что-то совершенно другое? Разве это не имеет значения? Я не хочу, чтобы он ссылался на библиотеку в системе. - person The Quantum Physicist   schedule 21.12.2018-ltsan
должен работать даже с этой библиотекой со странным названием? Как я могу гарантировать, что он не будет использовать тот, что из системы? - person The Quantum Physicist   schedule 21.12.2018-ltsan
, вы правы, говоря, что будет выбран неправильный (обычно gcc). Вот почему clang имеет опцию-fsanitizer
, чтобы установить внутреннее имя для библиотеки. - person Matthieu Brucher   schedule 21.12.2018