c++ - CMAKE 为 C++ 编译器添加 gcov 选项

标签 c++ cmake mingw mingw-w64

我需要调试一个流程,因此使用 cmake/mingw64 C++ 编译器编译它的代码。我知道如果我们为每个源代码文件使用 -fprofile-arcs -ftest-coverage 进行编译 - 我将获得调试流程执行细节,从而帮助我理解和修复流程。所以我在我的 CMakelists.txt 中添加了以下 CMAKE 选项,但我得到了提到的错误:

SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
SET(GCC_COVERAGE_LINK_FLAGS    "-fprofile-arcs -fprofile-generate -lgcov --coverage")
add_definitions(${GCC_COVERAGE_COMPILE_FLAGS})
SET( CMAKE_CXX_FLAGS  "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )
SET( CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}" )

构建过程中的错误 - 链接:

[76/150] Linking CXX executable test.exe
FAILED: test.exe
cmd.exe /C "cd . && C:\tools\mingw64\bin\c++.exe -DGSL_THROW_ON_CONTRACT_VIOLATION -Wall -ftrack-macro-expansion=0 -Werror -std=gnu++14 -D _SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING -Og -g3   test.cpp.obj testhelp.cpp.obj  -o test.exe -Wl,--out-implib,test.dll.a -Wl,--major-image-version,0,--minor-image-version,0  ext/googletest/build/googlemock/libgmock_main.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
test/case/TestArgs.cpp.obj: In function `_GLOBAL__sub_I_65535_0__ZN2cc5shell30TestCommandArguments_Size_Test10test_info_E':
:(.data+0x2ee0): undefined reference to `__gcov_merge_add'
In function `_GLOBAL__sub_I_65535_0__ZN2cc5shell58TestArgumentCompletion_arg_root_2_subgroups_empty_arg_Test10test_info_E':
: undefined reference to `__gcov_init'
: undefined reference to `__gcov_merge_add'

我尝试了各种方法来解决它 - 但它没有帮助?

最佳答案

链接器选项 -lgcov 实际上是链接“gcov”,所以最好这样标记:

link_libraries(gcov)

CMAKE_EXE_LINKER_FLAGS 变量和 link_libraries/target_link_libraries 命令之间的区别在于,该变量将链接器标志添加到链接命令行之前 目标文件,但命令在目标文件之后 添加链接器标志。当库和目标文件的错误顺序导致 undefined reference 错误时,这种差异在符号解析中至关重要。

关于c++ - CMAKE 为 C++ 编译器添加 gcov 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48181618/

相关文章:

c++ - istringstream - 为什么没有重置功能

c++ - QtCreator 4 和 CMake 参数

windows - 在 Windows (MinGW) 上编译 Nasm 程序时未定义对 `WinMain' 的引用

c++ - Win-builds 与 MinGW-builds 之间的区别

java - 如何找到传递给函数的参数的字节数?

c++ - 将数百万个对象插入 Vector = bad-alloc

c++ - 使用 mkdir() 创建文件夹后,如何让程序将文件和其他信息保存到新文件夹中

c++ - 我的 API 应该使用非成员函数来作用于对象,还是使函数成为对象的公共(public)函数?

c++ - 使用不同于系统默认编译器的编译器运行 CMake

qt - CMake + Qt : define the moc/ui output directory