2012-12-06 31 views
5

Làm thế nào đến CHECK_FUNCTION_EXISTS không tìm thấy clock_gettime?Tại sao CHECK_FUNCTION_EXISTS không tìm thấy clock_gettime trong CMake?

tôi sử dụng đoạn mã sau vào CMakeLists.txt tôi:

include(CheckFunctionExists) 

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

Đây là trên một hệ thống POSIX Tôi biết có clock_gettime. Tuy nhiên, tôi chỉ đơn giản nhận được:

-- Looking for clock_gettime - not found 

Trả lời

7

clock_gettime được tìm thấy trong librt chúng ta cần phải liên kết đến đó khi thực hiện việc kiểm tra (nếu không CMake sẽ chỉ đơn giản là không biên dịch các chương trình thử nghiệm nó tạo ra để kiểm tra xem chức năng tồn tại).

Điều này là không thể với CHECK_FUNCTION_EXISTS. Thay vào đó CHECK_LIBRARY_EXISTS phải được sử dụng:

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

này bây giờ sẽ làm việc và đầu ra:

-- Looking for clock_gettime in rt - found 

Cập nhật: Trong glibc mới hơn 2.17+ clock_gettime đã được chuyển từ librt để libc.

Vì vậy, để chắc chắn để tìm clock_gettime trên tất cả các hệ thống, bạn sẽ cần phải làm hai kiểm tra:

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

này sẽ thay đổi với việc phát hành glibc 2.17 . Các ký hiệu clock_ * đang được chuyển vào libc và mã sẽ không còn cần liên kết với librt nữa. –

0

Đây là những gì tôi đang sử dụng:

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() 
Các vấn đề liên quan