2012-12-06 20 views
5

CHECK_FUNCTION_EXISTS, clock_gettime'u nereden bulabilir?Neden CHECK_FUNCTION_EXISTS CMake içinde clock_gettime bulmuyor?

Ben benim CMakeLists.txt aşağıdaki kodu kullanın:

include(CheckFunctionExists) 

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

Bu benim clock_gettime olduğunu biliyorum bir POSIX sisteminde üzerindedir. Oysa ben sadece alıyorum: clock_gettime biz çeki yaparken o bağlamanız gereken librt bulunan

-- Looking for clock_gettime - not found 

cevap

7

Çünkü (Aksi CKağıt sadece bunu fonksiyon varsa test etmek üretir test programı derlemek başarısız olur). Bu, CHECK_FUNCTION_EXISTS ile mümkün değildir. Bunun yerine CHECK_LIBRARY_EXISTS kullanılmalıdır:

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

Bu şimdi çalışmak ve çıktısı:

-- Looking for clock_gettime in rt - found 

Güncelleme: yeni glibc olarak 2.17+ clock_gettimelibrt den libc taşındı.

Yani iki denetimlerini yapmak gerekir tüm sistemlerde clock_gettime bulacağınızdan emin olmak için:

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

Bu glibc 2.17 sürümü ile değişecek . Clock_ * sembolleri libc'ye taşınıyor ve kodun librt ile bağlantı kurması gerekmeyecek. –

0

Bu kullanıyorum budur:

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