如何使用比系统提供的更新版本的clang链接到线程消毒剂
How can I link to thread sanitizer with a newer version of clang than the system provides?
我正常从其网站下载最新的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。
所以我搜索了Clang随附的可用tsan
库,这是我发现的:
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组件。
我如何从最新叮当的预构建二进制文件中链接到tsan?
设置汇编的链接标志是一个很大的禁忌:
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread")
然后,您也需要为链接标志做同样的事情:
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=thread")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=thread")
您也只能更改目标属性:
set_target_properties(${TARGET} PROPERTIES
LINK_FLAGS -fsanitizer=thread
COMPILE_FLAGS -fsanitizer=thread)
请注意,这覆盖了所有标志(我不记得CMAKE_CXX_FLAGS
是否也存在,也许不在),您可能需要检索当前的标志并附加这些而不是删除所有内容。
clang知道其卫生支持库在哪里(正如您说的那样,这些标签上标有三重信息,并且不在通常的库文件夹中,以避免其他安装的任何污染),并且完整的fsanitize=tsan
标志将让它拾取这些版本。请注意,它不是-ltsan
,而是一个完整的选项,它会使Clang在其自身消毒剂所在的路径中拾取适当的后端。
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- Clang 8 带有静态 constexpr 和数组的链接器错误 - 错误是什么以及如何解决它?
- Eclipse CDT clang 工具链 - 无法从链接器选项中删除 stdlibc++,但可以添加 libc++,E
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何修复 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- std::to_chars在MacOS/clang上编译但不链接
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 程序使用boost::文件系统链接clang,但不使用gcc
- C++ XCODE ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -
- 在这种情况下,GCC 和 clang 是否显示与 Visual Studio 相同的结果,关于语言链接?
- clang:错误:链接器命令失败,C++代码中的退出代码为 1(使用 -v 查看调用)
- Clang 3.8 错误:参数 '-fuse-ld=gold-2.25' 中的链接器名称无效
- Clang在手动链接时不会生成PROFRAW文件
- C++编译错误:ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v
- gcc 和 clang 中 constexpr 静态成员变量的链接器错误
- 将 CLANG 构建的可执行文件与 G++-v6 构建的 Boost 库链接时出错
- CLang++ 链接器未定义的符号用于体系结构x86_64
- 在linux上链接clang/llvm库总是失败
- 在OS X上链接clang++会产生很多符号未发现错误
- 链接clang库总是未定义的符号