Почему zig не может создать программу, которую может создать clang? ⇐ Linux
Почему zig не может создать программу, которую может создать clang?
Я хочу использовать zig для создания кода на C++, для которого требуется libunwind. Я могу использовать clang для компиляции, но zig c++ выдает ошибки.
❯ clang src/profile.cpp -I src -lstdc++ -L /usr/lib/x86_64-linux-gnu -lunwind -lunwind-x86_64 -lunwind-ptrace -о профиль # clang компилируется без ошибок ❯ zig c++ src/profile.cpp -I src -lstdc++ -L /usr/lib/x86_64-linux-gnu -lunwind -lunwind-x86_64 -lunwind- ptrace -o профиль В файле, включенном в src/profile.cpp:10: /usr/include/x86_64-linux-gnu/libunwind-ptrace.h:56:8: ошибка: неизвестное имя типа 'unw_accessors_t' 56 | extern unw_accessors_t _UPT_accessors; | ^ src/profile.cpp:74:7: ошибка: использование необъявленного идентификатора unw_init_remote 74 | unw_init_remote(&курсор, addr_space, контекст); | ^ Возникло 2 ошибки. Я пробую это на машине x86_64 с Ubuntu 22.04.
Я не очень хорошо знаком с C++. Таким образом, две приведенные выше команды кажутся мне одинаковыми. Я только что услышал, что zig и zig.build можно использовать для компиляции C/C++ вместо Makefile, и хочу попробовать.
Исходный код просто пытается профилировать другой процесс. Я удалил часть, связывающую cxxopts в приведенных выше строках, и в настоящее время код неверен.
#include #include #include #include #include #include #include #include #include // #include #include #include auto main(int argc, char **argv) -> int { cxxopts::Options options("profile", "Профилирование команды"); интервал u32; std::vector cmds; // формат clang отключен options.add_options() («h,help», «Напечатать справку») ("i,interval", "Интервал обновления профиля", cxxopts::value(interval)->default_value("1000")) («cmds», «команда для запуска», cxxopts::value(cmds)) ; // clang-формат включен options.parse_positional({"cmds"}); автоматический результат = options.parse(argc, argv); if (result["help"].as() || !result.count("cmds")) { printf("%s\n", options.help().c_str()); вернуть 0; } std::unordered_mapsymbol_count; unw_addr_space_t addr_space = unw_create_addr_space(&_UPT_accessors, 0); pid_t pid = fork(); если (пид == 0) { // дочерний процесс, выполняем команду ptrace(PTRACE_TRACEME, 0, 0, 0); std::vector args; for (auto &arg: cmds) { args.push_back(&arg[0]); } args.push_back(nullptr); execvpe(args[0], args.data(), nullptr); } еще { printf("pid = %d\n", pid); // родительский процесс // когда-либо мс, обновляем профиль // как только дочерний процесс завершится, выходим и печатаем профиль в то время как (истина) { // Проверяем, завершился ли дочерний процесс международный статус; int res = waitpid(pid, &status, WNOHANG); printf("status = %d res = %d\n", status, res); если (рез == -1) { ошибка("waitpid"); возврат 1; } если (WIFEXITED(статус)) { // Дочерний процесс завершен // Распечатываем профиль и выходим printf("===== Профиль =====\n"); printf("status = %d\n", status); // for (авто &pair:symbol_count) { // printf("%s: %d\n", Pair.first.c_str(), Pair.Second); // } вернуть 0; } void *context = _UPT_create(pid); курсор unw_cursor_t; unw_init_remote(&курсор, addr_space, контекст); // Получаем текущее имя процесса // char proc_name[1024] = {0}; // смещение unw_word_t; // unw_get_proc_name(&cursor, proc_name, sizeof(proc_name), &offset); // printf("proc_name = %s\n", proc_name); // // Обновляем количество символов // if (symbol_count.count(proc_name)) { //symbol_count[proc_name]++; // } еще { //symbol_count[proc_name] = 1; // } _UPT_resume(addr_space, &cursor, nullptr); _UPT_destroy (контекст); usleep(интервал * 1000); } } }
Я хочу использовать zig для создания кода на C++, для которого требуется libunwind. Я могу использовать clang для компиляции, но zig c++ выдает ошибки.
❯ clang src/profile.cpp -I src -lstdc++ -L /usr/lib/x86_64-linux-gnu -lunwind -lunwind-x86_64 -lunwind-ptrace -о профиль # clang компилируется без ошибок ❯ zig c++ src/profile.cpp -I src -lstdc++ -L /usr/lib/x86_64-linux-gnu -lunwind -lunwind-x86_64 -lunwind- ptrace -o профиль В файле, включенном в src/profile.cpp:10: /usr/include/x86_64-linux-gnu/libunwind-ptrace.h:56:8: ошибка: неизвестное имя типа 'unw_accessors_t' 56 | extern unw_accessors_t _UPT_accessors; | ^ src/profile.cpp:74:7: ошибка: использование необъявленного идентификатора unw_init_remote 74 | unw_init_remote(&курсор, addr_space, контекст); | ^ Возникло 2 ошибки. Я пробую это на машине x86_64 с Ubuntu 22.04.
Я не очень хорошо знаком с C++. Таким образом, две приведенные выше команды кажутся мне одинаковыми. Я только что услышал, что zig и zig.build можно использовать для компиляции C/C++ вместо Makefile, и хочу попробовать.
Исходный код просто пытается профилировать другой процесс. Я удалил часть, связывающую cxxopts в приведенных выше строках, и в настоящее время код неверен.
#include #include #include #include #include #include #include #include #include // #include #include #include auto main(int argc, char **argv) -> int { cxxopts::Options options("profile", "Профилирование команды"); интервал u32; std::vector cmds; // формат clang отключен options.add_options() («h,help», «Напечатать справку») ("i,interval", "Интервал обновления профиля", cxxopts::value(interval)->default_value("1000")) («cmds», «команда для запуска», cxxopts::value(cmds)) ; // clang-формат включен options.parse_positional({"cmds"}); автоматический результат = options.parse(argc, argv); if (result["help"].as() || !result.count("cmds")) { printf("%s\n", options.help().c_str()); вернуть 0; } std::unordered_mapsymbol_count; unw_addr_space_t addr_space = unw_create_addr_space(&_UPT_accessors, 0); pid_t pid = fork(); если (пид == 0) { // дочерний процесс, выполняем команду ptrace(PTRACE_TRACEME, 0, 0, 0); std::vector args; for (auto &arg: cmds) { args.push_back(&arg[0]); } args.push_back(nullptr); execvpe(args[0], args.data(), nullptr); } еще { printf("pid = %d\n", pid); // родительский процесс // когда-либо мс, обновляем профиль // как только дочерний процесс завершится, выходим и печатаем профиль в то время как (истина) { // Проверяем, завершился ли дочерний процесс международный статус; int res = waitpid(pid, &status, WNOHANG); printf("status = %d res = %d\n", status, res); если (рез == -1) { ошибка("waitpid"); возврат 1; } если (WIFEXITED(статус)) { // Дочерний процесс завершен // Распечатываем профиль и выходим printf("===== Профиль =====\n"); printf("status = %d\n", status); // for (авто &pair:symbol_count) { // printf("%s: %d\n", Pair.first.c_str(), Pair.Second); // } вернуть 0; } void *context = _UPT_create(pid); курсор unw_cursor_t; unw_init_remote(&курсор, addr_space, контекст); // Получаем текущее имя процесса // char proc_name[1024] = {0}; // смещение unw_word_t; // unw_get_proc_name(&cursor, proc_name, sizeof(proc_name), &offset); // printf("proc_name = %s\n", proc_name); // // Обновляем количество символов // if (symbol_count.count(proc_name)) { //symbol_count[proc_name]++; // } еще { //symbol_count[proc_name] = 1; // } _UPT_resume(addr_space, &cursor, nullptr); _UPT_destroy (контекст); usleep(интервал * 1000); } } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
MacOS Clang Compiler выпуск (Apple Clang версия 17.0.0 (Clang-1700.0.13.5))))
Anonymous » » в форуме C++ - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-