Как сгенерировать PDB-файлы с помощью cmake и gcc?

#cmake #code-coverage #pdb #test-coverage

Вопрос:

Я хочу использовать OpenCppCoverage для проверки охвата моих исходных файлов модульным тестом. Однако, похоже, мне нужны файлы .pdb, сгенерированные для работы OpenCppCoverage.

Проблема в том, что я не могу генерировать такие файлы из своей сборки. Вот мой CmakeLists.txt

 cmake_minimum_required(VERSION 3.17) # version can be different

project(GUnitTestingVSCode) #name of your project

add_subdirectory(googletest) # add googletest subdirectory

add_compile_definitions(TELEMETRY_DIAGNOSTICS)
add_compile_definitions(GTEST)

set(CMAKE_PDB_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/build/")

include_directories(googletest/include/) # this is so we can #include <gtest/gtest.h>
include_directories(googletest/googlemock/include/gmock/) # this is so we can #include <gmock/gmock.h>
include_directories("${CMAKE_SOURCE_DIR}/"
    "${CMAKE_SOURCE_DIR}/inc/"
    "${CMAKE_SOURCE_DIR}/mocks/"
    "${CMAKE_SOURCE_DIR}/../submodule/library/inc"
    "${CMAKE_SOURCE_DIR}/../submodule/library/inc/Application"
    "${CMAKE_SOURCE_DIR}/../submodule/library/inc/Datalink/"
    "${CMAKE_SOURCE_DIR}/../submodule/library/inc/Demodulation"
    "${CMAKE_SOURCE_DIR}/../submodule/library/inc/Modulation"
    "${CMAKE_SOURCE_DIR}/../inc/Peripherals/"
    "${CMAKE_SOURCE_DIR}/../inc/Protocol/"
    "${CMAKE_SOURCE_DIR}/../inc/Diagnostics/")

file(GLOB_RECURSE SOURCES RELATIVE 
    ${CMAKE_SOURCE_DIR} "../src/Peripherals/DMA.c" "../src/Diagnostics.c"
    ${CMAKE_SOURCE_DIR} "../src/Protocol/DataLink.c"
    "src/*.cpp" "googletest/*.cpp" "mocks/*.c"
    "../submodule/library/src/*.c")

add_executable(gUnitTest ${SOURCES}) # add this executable
set(CMAKE_BUILD_TYPE RelWithDebInfo)
set_target_properties(gUnitTest PROPERTIES
    COMPILE_PDB_NAME "gUnitTestCompiled"
    COMPILE_PDB_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/build/"
    PDB_NAME "gUnitTestLinker"
    PDB_OUTPUT_DIRECTORY  "${CMAKE_SOURCE_DIR}/build/")
target_link_libraries(gUnitTest PUBLIC gtest gmock) # link google test to this executable
 

Однако, когда я создаю свою тестовую папку в режиме RelWithDebInfo (я также пробовал отладку), я не получаю файлов .pdb в папке сборки. Может ли кто-нибудь помочь мне понять, что я делаю не так?

Используемый компилятор-GCC 9.2.0 (mingw32)

Комментарии:

1. Вы провели свои модульные тесты?

2. Да, мои модульные тесты работают просто отлично. Может быть, это потому, что я использую компилятор GCC, и он не поддерживает создание файлов PDB?

3. Мой 5-минутный серач в Google: github.com/OpenCppCoverage/OpenCppCoverage/issues/85 -> > github.com/boostorg/nowide/blob/… . I build my Test folder in RelWithDebInfo mode (I also tried Debug), I get no .pdb Конечно, вы этого не сделаете, вы должны запустить свои тесты в режиме OpenCppCoverage .

4. Обновите свой вопрос подробным выводом сборки. gcc нужны дополнительные флаги для покрытия, поэтому нам нужно будет проверить, включены ли они.

5. Установка CMAKE_BUILD_TYPE в CMakeLists.txt недопустимо, особенно после того, как вы уже создали некоторые целевые объекты, добавили подкаталоги и т. Д.

Ответ №1:

Я смог разобраться в себе сам. Итак, вот ответ, если кто-то борется с тем же самым: компилятор gcc не может генерировать файлы .pdb. Что можно сделать, так это следующее:

  1. Преобразуйте отладочную информацию из gcc в файлы pdb с помощью конвертера cv2pdb
  2. Используйте компилятор llvm/clange, который поддерживает создание .pdb
  3. Используйте другой инструмент покрытия кода, такой как gcov от самого gcc

Я решил использовать вариант 3 и заменить opencppcoverage на gcov (на самом деле я использую gcovr). Мне пришлось включить дополнительные флаги для освещения, как упоминалось выше:

 -fprofile-arcs -ftest-coverage -fPIC -O0