#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), работает нормально.