Почему функция проверки не существует найти часы gettime в CMake?
почему CHECK_FUNCTION_EXISTS
не нашел clock_gettime
?
Я использую следующий код в моем CMakeLists.txt
:
include(CheckFunctionExists)
set(CMAKE_EXTRA_INCLUDE_FILES time.h)
CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME)
это в системе POSIX, которую я знаю, имеет clock_gettime
. И все же я просто получаю:
-- Looking for clock_gettime - not found
2 ответов
, потому что clock_gettime
находится в librt
нам нужно связать это при выполнении проверки (в противном случае CMake просто не сможет скомпилировать тестовую программу, которую он генерирует, чтобы проверить, существует ли функция).
это невозможно с CHECK_FUNCTION_EXISTS
. Вместо CHECK_LIBRARY_EXISTS необходимо:
include(CheckLibraryExists)
CHECK_LIBRARY_EXISTS(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME)
теперь это будет работать и выводить:
-- Looking for clock_gettime in rt - found
обновление: в новом glibc 2.17+clock_gettime
был перемещен из librt
в libc
.
поэтому обязательно найдите clock_gettime
на всех системах вам нужно будет сделать две проверки:
include(CheckLibraryExists)
CHECK_LIBRARY_EXISTS(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME)
if (NOT HAVE_CLOCK_GETTIME)
set(CMAKE_EXTRA_INCLUDE_FILES time.h)
CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME)
SET(CMAKE_EXTRA_INCLUDE_FILES)
endif()
Это то, что я использую:
include(CheckFunctionExists)
include(CheckLibraryExists)
check_library_exists(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME)
if (HAVE_CLOCK_GETTIME)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lrt")
set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lrt")
else()
# might also be in libc
check_library_exists(c clock_gettime "" HAVE_CLOCK_GETTIME)
endif()