启用Thread Sanitizer构建的静态库链接时出现__tsan_...未定义引用
解决PDFium TSAN静态库链接错误问题
针对__tsan_memcpy未定义的链接错误
- 必须保证测试项目与PDFium使用完全相同版本的Clang编译器,Thread Sanitizer的符号与编译器版本强绑定,跨版本会出现符号不兼容。
- 不要仅在编译阶段添加
-fsanitize=thread,链接阶段也需要该选项。修改CMakeLists.txt,在定义可执行文件后添加:
或者在cmake配置时统一指定:target_compile_options(Test PRIVATE -fsanitize=thread) target_link_options(Test PRIVATE -fsanitize=thread)cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_C_FLAGS="-fsanitize=thread" \ -DCMAKE_CXX_FLAGS="-fsanitize=thread" \ -DCMAKE_EXE_LINKER_FLAGS="-fsanitize=thread" ..
针对Clang17升级后std::__Cr::__libcpp_verbose_abort未定义的错误
这是因为PDFium构建时默认使用自带的libc++,而测试项目可能使用了系统的libstdc或不匹配的libc版本,解决方案:
- 强制测试项目使用libc++编译链接,在CMakeLists.txt中添加:
target_compile_options(Test PRIVATE -stdlib=libc++) target_link_options(Test PRIVATE -stdlib=libc++) - 显式链接PDFium依赖的系统库,静态库不会自动传递依赖,需要手动添加:
target_link_libraries(Test PRIVATE pdfium pthread dl) - 确保测试项目的Clang版本与构建PDFium的版本完全一致,避免libc++的版本差异。
内容的提问来源于stack exchange,提问作者mathripper
相关产品推荐
相关产品推荐

