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_gettimeが見つかったのでlibrt、チェックを行うときにリンクする必要があります (そうしないと、関数が存在するかどうかをテストするために 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では、 から に移動されlibrtましたlibc

したがって、すべてのシステムで確実に見つけるclock_gettimeには、次の 2 つのチェックを行う必要があります。

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 に答える