我通常从他们的网站下载最新的 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 链接,则在运行程序时会出现段错误。
所以我搜索了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
那里似乎有 tsan 图书馆。我想我必须链接到他们。我怎么做?
这似乎不起作用:
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 组件的未定义引用。
如何从最新的 clang 的预构建二进制文件链接到 tsan?