Создание приложения с помощью clang с --coverage в windows

Я пытаюсь создать простое приложение cmake, чтобы протестировать предлагаемую функциональность покрытия, лязгнув в окнах (в 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")

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 057
1

Ответы 1

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

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 при компиляции и компоновке, документация по --coverage отсутствует. Один из примеров говорит, что вам нужно связать с --coverage, другой пример говорит, что вам нужно связать с -fprofile-instr-generate -fcoverage-mapping, и он будет связываться в библиотеках профилей по мере необходимости.

да, действительно, я тоже так думаю, но происходит то, что компоновщик не распознает флаг --coverage, он говорит «lld-link.exe: warning: ignoring unknown argument: --coverage» ... кажется, что есть проблемы с лязгом в окнах, потому что в Linux он работает нормально.

Nuno 03.12.2018 23:21

Обновите второй пример того, как он должен работать в командной строке. В этом примере говорится, что он связан с -fprofile-instr-generate -fcoverage-mapping. У меня нет инструментов, поэтому я просто основывал это на примерах. В командной строке вы можете запустить lld-link.exe --help и посмотреть, какие есть варианты?

fdk1342 03.12.2018 23:53

спасибо Фреду за помощь, но проблема в фазе компоновки, и компоновщик не знает ни одного из этих флагов (справка также не ссылается ни на один из вышеперечисленных флагов), похоже, что в Windows мне не хватает библиотеки для ссылка на...

Nuno 04.12.2018 02:17

Использование LLVM 6.0.0 в Windows 7 работает в командной строке, как и в примерах. --coverage производит покрытие в стиле gcov при использовании clang++ или clang-cl. clang-cl -fprofile-instr-generate производит вывод профиля LLVM. Ни у кого не было проблем со ссылками. Вероятно, это как-то связано с вашей настройкой.

fdk1342 04.12.2018 05:00

да, как будто вы говорите, что проблем нет, но при использовании cmake проблемы, о которых сообщалось, возникли ... не знаю почему ..

Nuno 04.12.2018 10:27

Я наконец смог воспроизвести проблему. При использовании lld-link игнорирует библиотеку "C:\\Program Files\\LLVM\\lib\\clang\\6.0.0\\lib\\windows\\clang_rt.profi‌​le-x86_64.lib" в строке ссылки. Если вы запускаете clang++ в командной строке в оболочке разработки Visual Studio, он использует LINK.exe, и все работает. Если вы используете набор инструментов LLVM с Visual Studio, он использует lld-link.exe и игнорирует библиотеку. Я предполагал, что вы используете другой генератор. Возможно, если вы обновите вопрос с подробностями об используемых инструментах / версиях / генераторе, кто-то более знающий может помочь.

fdk1342 04.12.2018 16:10

вы совершенно правы ... добавив эту библиотеку в список целевых библиотек ссылок, она работает ... мне кажется, что есть проблема на стороне clang для окон. Я дополню вопрос вашим предложением, спасибо, Фред

Nuno 04.12.2018 16:37

Другие вопросы по теме