【问题标题】:Undefined references when using -fsanitize=address [closed]使用 -fsanitize=address 时未定义的引用 [关闭]
【发布时间】:2021-09-20 14:59:23
【问题描述】:

我在编译器选项中有-fsanitize=address,但是,我不知道为什么会收到多个undefined references 错误。如果我删除该选项,就没有问题。

g++ -O1 -fsanitize=address -g3 -fPIC -std=c++11 -Wall \
    -I/usr/local/cuda-11.2/include -I. -I/home/project/libcuda -I/home/project/src \
    -c trace_driven.cc -o ../build/release/trace_driven.o 

错误与 STL 向量有关。实例很多,看这个例子:

/home/project/trace-driven/trace_driven.cc:420: undefined reference to `__asan_report_load8'

【问题讨论】:

  • 你显示了一个 compile 命令(没有产生错误),然后是一个 link 错误,但没有显示链接命令,也没有说明 @ 的版本987654325@ 或您使用的平台。这不是提问的最佳方式。

标签: c++ gcc stl linker g++


【解决方案1】:

我不知道为什么会收到multiple undefined references 错误。

我们也不知道——你还没有向你展示 link 命令。

可能是因为您没有在链接命令上指定-fsanitize=address(您需要在链接时指定g++ 提供正确的库),除了在编译行指定该选项。

【讨论】:

  • 如果我能用一个最小的例子缩小范围,我会提供更多信息。
【解决方案2】:

我用clang++ 测试了你的命令行,它成功了。但似乎您需要使用-lasan-static-libasan for g++ 来链接其他库。

我找到了这些样本here:

using-gcc:
    g++-4.8 -o main-gcc -lasan -O -g -fsanitize=address -fno-omit-frame-pointer main.cpp && \
    ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=$(shell which llvm-symbolizer) ./main-gcc

using-gcc-static:
    g++-4.8 -o main-gcc-static -static-libstdc++ -static-libasan -O -g -fsanitize=address -fno-omit-frame-pointer main.cpp && \
    ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=$(shell which llvm-symbolizer) ./main-gcc-static

using-clang:
    clang -o main-clang -x c++ -O -g -fsanitize=address main.cpp && \
    ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=$(shell which llvm-symbolizer) ./main-clang

【讨论】:

  • g++-4.8 -o ... -lsan ... plain 错误(链接行上的对象和库的顺序很重要,而你的顺序是错误的)。
  • @EmployedRussian 这不是我的,我只是直接从要点来源链接。
猜你喜欢
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 2016-09-18
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
相关资源
最近更新 更多