Я пытаюсь создать простое приложение 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")
все работает ... но разве это решение моей проблемы?





В соответствии с этими Примечания и Примечания и простыми пример и еще одним пример вам нужно сделать это по-другому.
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, и он будет связываться в библиотеках профилей по мере необходимости.
Обновите второй пример того, как он должен работать в командной строке. В этом примере говорится, что он связан с -fprofile-instr-generate -fcoverage-mapping. У меня нет инструментов, поэтому я просто основывал это на примерах. В командной строке вы можете запустить lld-link.exe --help и посмотреть, какие есть варианты?
спасибо Фреду за помощь, но проблема в фазе компоновки, и компоновщик не знает ни одного из этих флагов (справка также не ссылается ни на один из вышеперечисленных флагов), похоже, что в Windows мне не хватает библиотеки для ссылка на...
Использование LLVM 6.0.0 в Windows 7 работает в командной строке, как и в примерах. --coverage производит покрытие в стиле gcov при использовании clang++ или clang-cl. clang-cl -fprofile-instr-generate производит вывод профиля LLVM. Ни у кого не было проблем со ссылками. Вероятно, это как-то связано с вашей настройкой.
да, как будто вы говорите, что проблем нет, но при использовании cmake проблемы, о которых сообщалось, возникли ... не знаю почему ..
Я наконец смог воспроизвести проблему. При использовании lld-link игнорирует библиотеку "C:\\Program Files\\LLVM\\lib\\clang\\6.0.0\\lib\\windows\\clang_rt.profile-x86_64.lib" в строке ссылки. Если вы запускаете clang++ в командной строке в оболочке разработки Visual Studio, он использует LINK.exe, и все работает. Если вы используете набор инструментов LLVM с Visual Studio, он использует lld-link.exe и игнорирует библиотеку. Я предполагал, что вы используете другой генератор. Возможно, если вы обновите вопрос с подробностями об используемых инструментах / версиях / генераторе, кто-то более знающий может помочь.
вы совершенно правы ... добавив эту библиотеку в список целевых библиотек ссылок, она работает ... мне кажется, что есть проблема на стороне clang для окон. Я дополню вопрос вашим предложением, спасибо, Фред
да, действительно, я тоже так думаю, но происходит то, что компоновщик не распознает флаг --coverage, он говорит «lld-link.exe: warning: ignoring unknown argument: --coverage» ... кажется, что есть проблемы с лязгом в окнах, потому что в Linux он работает нормально.