Ошибка CMake `test_big_endian` с `не найден подходящий тип’

#c #gcc #cmake

#c #gcc #cmake

Вопрос:

gcc (GCC) 10.2.0 cmake версии 3.19.4

CMakeFile.txt

     ...
    test_big_endian(WORDS_BIGENDIAN)
    ...
 

вывод cmake:

— Проверьте, является ли система большой конечной — Поиск 16-битного целого числа — Поиск sys / types.h — Поиск sys / types.h — не найден — Поиск stdint.h — Поиск stdint.h — не найден — Поиск stddef.h — Поиск stddef.h — Поиск stddef.h -не найдено — Проверка размера неподписанного короткого замыкания — Проверка размера неподписанного короткого замыкания — сбой проверки размера неподписанного int — Проверка размера неподписанного int — сбой проверки размера неподписанного длинного — Проверка размера неподписанного длинного — ошибка CMake в /usr/local/cmake/ share/cmake-3.19/Modules/TestBigEndian.cmake:51 (сообщение): не найден подходящий тип Стека вызовов (самый последний вызов первым): contrib/xz/cmake/tuklib_integer.cmake:23 (test_big_endian)
contrib/xz/CMakeLists.txt:126 (tuklib_integer)

Вывод CMakeError.log:

Не удалось определить, существует ли включаемый файл sys/types.h, со следующим выводом: Изменить каталог: /data/clickhouse/clickhouse/ClickHouse/build/CMakeFiles/CMakeTmp

Запустите команду (ы) сборки:/usr/local/bin/ninja cmTC_73c6f amp;amp; [1/2] Создание CMakeFiles объекта C/cmTC_73c6f.dir/CheckIncludeFile.c.o [2/2] Ошибка связывания C исполняемым файлом cmTC_73c6f: cmTC_73c6f: amp;amp; /usr/local/bin/gcc -fdiagnostics-color=всегда -pipe -msse4.1 -msse4.2 -mpopcnt -Wall -Werror -w -fuse-ld=gold -rdynamic -Wl,—no-undefined -Wl,-no-pie -rdynamic CMakeFiles/cmTC_73c6f.dir/CheckIncludeFile.c.o -o cmTC_73c6f amp;amp; : /usr/bin/ld.gold: ошибка: не удается найти -lgcc_s /usr/bin/ld.gold: ошибка: не удается найти -lgcc_s /lib/../lib64/libc.a(системный журнал.o): функция __vsyslog_chk: ошибка: неопределенная ссылка на ‘_Unwind_Resume’ /lib/../lib64/libc.a(системный журнал.o): функция __vsyslog_chk: ошибка: неопределенная ссылка на ‘_Unwind_Resume’ /lib/../lib64/libc.a (системный журнал.o): функция openlog: ошибка: неопределенная ссылка на ‘_Unwind_Resume’ /lib/../lib64/libc.a(системный журнал.o): журнал закрытия функции: ошибка: неопределенная ссылка на ‘_Unwind_Resume’ /lib/../lib64/libc.a (системный журнал.o) (.eh_frame 0xd78b): ошибка: неопределенная ссылка на ‘__gcc_personality_v0’ /lib/../lib64/libc.a(backtrace.o): функция backtrace_helper: ошибка: неопределенная ссылка на ‘_Unwind_GetIP’ /lib/../lib64/libc.a (backtrace.o): функция backtrace_helper: ошибка: неопределенная ссылка на ‘_Unwind_GetCFA’ /lib/../lib64/libc.a (backtrace.o): функция __backtrace: ошибка: неопределенная ссылка на ‘_Unwind_Backtrace’ collect2: ошибка: ld вернул 1статус выхода ninja: сборка остановлена: сбой подкоманды.

Я нашел, где произошла ошибка. cmake-3.19/Modules/CheckIncludeFile.cmake:

   if(${VARIABLE})
      if(NOT CMAKE_REQUIRED_QUIET)
        message(CHECK_PASS "found")
      endif()
      set(${VARIABLE} 1 CACHE INTERNAL "Have include ${INCLUDE}")
      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
        "Determining if the include file ${INCLUDE} "
        "exists passed with the following output:n"
        "${OUTPUT}nn")
    else()
      if(NOT CMAKE_REQUIRED_QUIET)
        message(CHECK_FAIL "not found")
      endif()
      set(${VARIABLE} "" CACHE INTERNAL "Have include ${INCLUDE}")
      file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
        "Determining if the include file ${INCLUDE} "
        "exists failed with the following output:n"
        "${OUTPUT}nn")
    endif()
 

Что означает ошибка? Как это исправить?

—- новое —-

/usr/bin/ld.gold: error: cannot find -lgcc_s причина по флагу gcc -Wl,-no-pie . Почему gcc_s не удается найти?

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

1. Я бы не стал слишком беспокоиться о том, что тест на big endian провалился. (Хорошая и переносимая реализация должна содержать слова как с большим, так и с маленьким порядковым номером.) Что меня могло бы серьезно обеспокоить, так это то, почему тест провалился: Looking for sys/types.h -- Looking for sys/types.h - not found -- Looking for stdint.h -- Looking for stdint.h - not found -- Looking for stddef.h -- Looking for stddef.h - not found . О sys/types.h , я не совсем уверен, но stdint.h и stddef.h ? Похоже, что стандартная библиотека C. заголовки не могут быть найдены. (Даже в C необходима стандартная библиотека C).

2. Причина заключалась в том , как cmake проверить, был ли sys/types.h exsits , выполнив команду /usr/local/bin/gcc -fdiagnostics-color=always -pipe -msse4.1 -msse4.2 -mpopcnt -Wall -Werror -w -fuse-ld=gold -rdynamic -Wl,--no-undefined -Wl,-no-pie -rdynamic CMakeFiles/cmTC_735df.dir/CheckIncludeFile.c.o -o cmTC_735df . Но /usr/bin/ld.gold: error: cannot find -lgcc_s при выполнении команды произошла некоторая ошибка. Я обнаружил, что эта ошибка возникла как -Wl,-no-pie параметр. Без этого команда может быть выполнена успешно.

Ответ №1:

Кстати, в cmake 3.20 они ввели CMAKE_LANG_BYTE_ORDER.

Что быстрее, чем использование TestBigEndian: <a rel=»noreferrer noopener nofollow» href=»https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_BYTE_ORDER.html#variable:CMAKE__BYTE_ORDER» rel=»nofollow noreferrer»>https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_BYTE_ORDER.html#variable:CMAKE__BYTE_ORDER

Ответ №2:

Причиной была версия ld слишком низкая (2.23). Обновлено до версии (2.27), работает нормально.