Создание приложения с помощью clang с --coverage на windows - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь создать простое приложение cmake, чтобы проверить функциональность покрытия, предлагаемую clang в Windows (в Linux все работает нормально).

Среда: Используемая версия Clang: 7.0 И использование набора инструментов LLVMс инструментами сборки Visual Studio 2017 cmake 3.12 с генератором ниндзя

То, что я делаю, очень просто: CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR)

project(test)

add_compile_options(--coverage)

add_executable(${PROJECT_NAME} 
    main.cpp
)

main.cpp настолько прост, насколько он может получить:

#include <iostream>
#include <string>
int main(int argc, char const *argv[]) {
    std::cout << "\ndone.\n";
    return 0;
}

с использованием сред инструментов сборки vcvarsall.bat Я инициализирую окружение для запуска и компиляции с помощью clang, например:

mkdir build
cd build
cmake -GNinja -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_LINKER=lld-link ..
cmake --build . 

и появляются следующие ошибки:

lld-link.exe: error: undefined symbol: __llvm_profile_runtime
>>> referenced by src\app\CMakeFiles\app.dir\main.cpp.obj:(__llvm_profile_runtime_user)


lld-link.exe: error: undefined symbol: __llvm_profile_register_function
>>> referenced by src\app\CMakeFiles\app.dir\main.cpp.obj:(__llvm_profile_register_functions)
>>> referenced by src\app\CMakeFiles\app.dir\main.cpp.obj:(__llvm_profile_register_functions)

Что я делаю неправильно или на что мне нужно ссылаться?

Спасибо

Обновление: с помощью ввода Фреда Я понял, какую библиотеку я должен связатьи если я добавлю следующее:

link_libraries("C:/Program Files/LLVM/lib/clang/7.0.0/lib/windows/clang_rt.profile-x86_64.lib")

все работает ... но действительно ли это решение моей проблемы?

1 Ответ

0 голосов
/ 03 декабря 2018

Согласно этим Примечаниям и Примечаниям и простому примеру и другому примеру вам нужно сделать это по-другому.

target_compile_options(${PROJECT_NAME} PRIVATE -fprofile-instr-generate -fcoverage-mapping)
target_link_libraries(${PROJECT_NAME} PRIVATE -fprofile-instr-generate -fcoverage-mapping)

Я не проверял синтаксис или что-то еще.Из того, что я понял, --coverage является старым флагом создания gcov совместимых данных.В документах LLVM приведен пример -fprofile-instr-generate -fcoverage-mapping при команде compile и link, документации по --coverage нет.В одном из примеров говорится, что вам нужно связать с --coverage, в другом примере говорится, что вам нужно связать с -fprofile-instr-generate -fcoverage-mapping, и он будет ссылаться на библиотеки профилей по мере необходимости.

...