7

怎么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
4

2 回答 2

9

因为我们需要在进行检查clock_gettimelibrt链接到它(否则 CMake 将无法编译它生成的测试程序以测试该函数是否存在)。

这是不可能的CHECK_FUNCTION_EXISTS。相反,必须使用CHECK_LIBRARY_EXISTS :

include(CheckLibraryExists)
CHECK_LIBRARY_EXISTS(rt clock_gettime "" HAVE_CLOCK_GETTIME)

这现在可以工作并输出:

-- Looking for clock_gettime in rt - found

更新:在较新的 glibc 2.17+中clock_gettime已从.librtlibc

因此,要确保clock_gettime在所有系统上找到,您需要进行两项检查:

include(CheckLibraryExists)
CHECK_LIBRARY_EXISTS(rt clock_gettime "" 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()
于 2012-12-06T15:57:43.723 回答
0

这就是我正在使用的:

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()
于 2015-09-13T09:08:41.383 回答