2012-12-06 11 views
5

Jak to możliwe, że CHECK_FUNCTION_EXISTS nie znajduje clock_gettime?Dlaczego CHECK_FUNCTION_EXISTS znaleźć clock_gettime w CMake?

używam następujący kod w moim CMakeLists.txt:

include(CheckFunctionExists) 

set(CMAKE_EXTRA_INCLUDE_FILES time.h) 
CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME) 

To jest na systemie POSIX wiem ma clock_gettime. Mimo to po prostu dostać:

-- Looking for clock_gettime - not found 

Odpowiedz

7

Ponieważ clock_gettime znajduje się w librt musimy połączyć się, że kiedy robi czek (inaczej CUpewnij będzie po prostu nie skompilować program testowy to generuje aby sprawdzić, czy funkcja istnieje).

Nie jest to możliwe z CHECK_FUNCTION_EXISTS. Zamiast tego należy użyć CHECK_LIBRARY_EXISTS:

include(CheckLibraryExists) 
CHECK_LIBRARY_EXISTS(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME) 

To będzie teraz pracować i wyjście:

-- Looking for clock_gettime in rt - found 

Aktualizacja W nowszych glibc 2.17+ clock_gettime został przeniesiony z librt do libc.

więc mieć pewność, aby znaleźć clock_gettime na wszystkich systemach trzeba by zrobić dwie kontrole:

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() 
+2

ta ulegnie zmianie wraz z wydaniem glibc 2.17 . Symbole clock_ * są przenoszone do biblioteki libc, a kod nie będzie już musiał łączyć się z biblioteką. –

0

to czego używam:

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() 
Powiązane problemy