Pro*_*mer 1 c++ mingw cmake 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}" )
Run Code Online (Sandbox Code Playgroud)
构建链接期间出错:
[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'
Run Code Online (Sandbox Code Playgroud)
我尝试了各种选项来解决它 - 但它没有帮助?
链接器选项-lgcov实际上是与“gcov”库链接,因此最好将其标记为:
link_libraries(gcov)
Run Code Online (Sandbox Code Playgroud)
CMAKE_EXE_LINKER_FLAGS变量和link_libraries/命令之间的区别target_link_libraries在于,变量在目标文件之前将链接器标志添加到链接命令行,但命令在目标文件之后添加链接器标志。当库和目标文件的错误顺序产生错误时,这种差异对于符号解析至关重要undefined reference。
| 归档时间: |
|
| 查看次数: |
1739 次 |
| 最近记录: |