代码之家  ›  专栏  ›  技术社区  ›  Indiana Kernick Michael Durrant

链接LLVM会导致gcov失败

  •  3
  • Indiana Kernick Michael Durrant  · 技术社区  · 7 年前

    经过 --coverage 连接到gcc,同时链接LLVM会导致 undefined reference to `__gcov_exit' 链接器出错。我已经建立了一个新的项目来尝试隔离这个问题。你可以 view the source on github 和 inspect the compiler output on Travis-CI

    这就是覆盖和非覆盖构建之间的区别

    -DCMAKE_CXX_FLAGS="--coverage"
    

    target_link_libraries(Test
            PUBLIC
            LLVMCore
    )
    

    这个 LLVM 工作成功了。这个 Coverage 工作成功了。这个 LLVM + Coverage 作业因此错误而失败

    undefined reference to `__gcov_exit'
    
    1 回复  |  直到 7 年前
        1
  •  5
  •   CristiFati    7 年前

    笔记

    -F轮廓弧 -最全覆盖率 -lgcov 标记)如中所述 [man7]: GCC(1) ( --覆盖范围
    Ubtu 16 x64 特拉维斯 非常好,出于调试目的,它的速度有点慢(特别是当您在编辑时可能会忘记或添加额外字符:),而且它不提供与本地计算机相同的访问级别,因为环境:

    • cmake 3.5.1
    • 通用条款5.4.0

    离屏幕上的东西很远 特拉维斯 词 构建(甚至没有检查这些回购是否公开)。反正 几乎无法使用,因为:

    它把我活活吃掉了,所以我最终建造了房子 疯狂的时刻 特拉维斯 )为了让它工作,那只是因为我没有注意到显而易见的事情。


    对于3种配置中的每一种,我将粘贴 编译 和 ( g++ )生成的命令(从 你的 [Travis CI]: Kerndog73 / gcov_error - Build #24

    1. LLVM :

      /usr/bin/g++-7  -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/usr/lib/llvm-7/include  -std=gnu++1z -o CMakeFiles/Test.dir/main.cpp.o -c /home/travis/build/Kerndog73/gcov_error/main.cpp
      /usr/bin/g++-7    -rdynamic CMakeFiles/Test.dir/main.cpp.o  -o Test  -L/usr/lib/gcc/x86_64-linux-gnu/4.8 /usr/lib/llvm-7/lib/libLLVMCore.a /usr/lib/llvm-7/lib/libLLVMBinaryFormat.a /usr/lib/llvm-7/lib/libLLVMSupport.a -lz -lrt -ldl -ltinfo -lpthread -lm /usr/lib/llvm-7/lib/libLLVMDemangle.a
      
    2. 新闻报道

      /usr/bin/g++-7  -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/usr/lib/llvm-7/include  --coverage   -std=gnu++1z -o CMakeFiles/Test.dir/main.cpp.o -c /home/travis/build/Kerndog73/gcov_error/main.cpp
      /usr/bin/g++-7  --coverage  -rdynamic CMakeFiles/Test.dir/main.cpp.o  -o Test
      
    3. LLVM + 新闻报道 :

      /usr/bin/g++-7  -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/usr/lib/llvm-7/include  --coverage   -std=gnu++1z -o CMakeFiles/Test.dir/main.cpp.o -c /home/travis/build/Kerndog73/gcov_error/main.cpp
      /usr/bin/g++-7  --coverage  -rdynamic CMakeFiles/Test.dir/main.cpp.o  -o Test  -L/usr/lib/gcc/x86_64-linux-gnu/4.8 /usr/lib/llvm-7/lib/libLLVMCore.a /usr/lib/llvm-7/lib/libLLVMBinaryFormat.a /usr/lib/llvm-7/lib/libLLVMSupport.a -lz -lrt -ldl -ltinfo -lpthread -lm /usr/lib/llvm-7/lib/libLLVMDemangle.a
      

    -L/usr/lib/gcc/x86_64-linux-gnu/4.8 当 包括在内。 gcc 4.8 是 安装在 ,显然如此 海湾合作委员会 4.8 用于链接,即 未定义的行为 .
    收集 命令(靠近 )从一个微小的变化(与 )的 (使用指定的所有库) -l* 并且没有完整路径(例如。 -lgcov -lgcc_s -lgcc 版本,因为将从错误的目录中拾取):

    /usr/lib/gcc/x86_64-linux-gnu/7/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/7/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper -plugin-opt=-fresolution=/tmp/ccyDh97q.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -export-dynamic -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro -o Test /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/7/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/7 -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/7/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/7/../../.. CMakeFiles/Test.dir/main.cpp.o /usr/lib/llvm-7/lib/libLLVMCore.a /usr/lib/llvm-7/lib/libLLVMBinaryFormat.a /usr/lib/llvm-7/lib/libLLVMSupport.a -lz -lrt -ldl -ltinfo -lpthread /usr/lib/llvm-7/lib/libLLVMDemangle.a -lstdc++ -lm -lgcov -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/7/crtend.o /usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/crtn.0
    

    某些测试命令放置在 特拉维斯·伊梅尔先生 后记 第节,产生了以下输出:

    $ _GCOV_LIB7=/usr/lib/gcc/x86_64-linux-gnu/7/libgcov.a
    $ (nm -S ${_GCOV_LIB7} 2>/dev/null | grep __gcov_exit) || echo ${_GCOV_LIB7}
    0000000000001e40 000000000000008b T __gcov_exit
    $ _GCOV_LIB48=/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcov.a
    $ (nm -S ${_GCOV_LIB48} 2>/dev/null | grep __gcov_exit) || echo ${_GCOV_LIB48}
    /usr/lib/gcc/x86_64-linux-gnu/4.8/libgcov.a
    

    ( )在两个相关版本之间的某个地方进行了修改( __gcov_出口 添加了符号),以及 我知道它有一个但是 ld 没有提供它(因为错误的库),因此出现错误。

    做 llvm gcc 4.8 -或者离它很近),但以下是我能想到的:

    1. llvm (虽然我在快速浏览时没有发现任何此类限制 [LLVM]: Getting Started with the LLVM System )
    2. 窃听器 llvm (考虑到我遇到的另一个问题,我倾向于认为这是赢家)

    1. g++ 4.8 -默认情况下安装在 )

      • export CXX=g++
      • g++ ( 克马克 这次)不知道 cxx_标准_17 ,所以最简单的方法是移除传入神经 C++17 “合规”)
    2. 由于我不知道如何“撤消”传递(错误的)库搜索路径,所以我提出的解决方法是指定正确的路径 之前 信息技术

      :

      cmake_minimum_required(VERSION 3.2)
      project(gcov_test)
      
      find_package(LLVM 7.0.0 REQUIRED CONFIG)
      message(STATUS "Found LLVM: ${LLVM_DIR} ${LLVM_PACKAGE_VERSION}")
      
      add_executable(Test
          "main.cpp"
      )
      
      target_compile_features(Test
          PUBLIC cxx_std_17
      )
      
      target_include_directories(Test
          PUBLIC ${LLVM_INCLUDE_DIRS}
      )
      
      target_compile_definitions(Test
          PUBLIC ${LLVM_DEFINITIONS}
      )
      
      if(LINK_WITH_LLVM)
          # @TODO - cfati: Everything in this block is to avoid hardcoding default libgcc path (/usr/lib/gcc/x86_64-linux-gnu/7)
          set(_COLLECT_LTO_WRAPPER_TEXT "COLLECT_LTO_WRAPPER=")
          execute_process(
              COMMAND bash -c "$0 -v 2>&1 | grep ${_COLLECT_LTO_WRAPPER_TEXT} | sed s/${_COLLECT_LTO_WRAPPER_TEXT}//" "${CMAKE_CXX_COMPILER}"
              OUTPUT_VARIABLE _GAINARIE_COLLECT_TMP_VAR
          )
          get_filename_component(_GAINARIE_GCC_DEFAULT_PATH ${_GAINARIE_COLLECT_TMP_VAR} DIRECTORY)
          set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${_GAINARIE_GCC_DEFAULT_PATH}")
          #set (GCCOPT "${GCCOPT} -L${_GAINARIE_GCC_DEFAULT_PATH}")
          # @TODO END
          target_link_libraries(Test
              PUBLIC LLVMCore
          )
      endif()
      

      注 当前位置我试图想出一些更优雅的东西(我相信是的),但我不能(尝试使用 CMAKE\u CXX\u隐式\u链接\u目录 , 目标链接库 , 链接目录 还有一些)在这一点上。