2012-12-06 16 views
5

कैसे CHECK_FUNCTION_EXISTSclock_gettime नहीं मिला?क्यों 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 

उत्तर

7

क्योंकि clock_gettimelibrt हम जब जांच कर रही है कि करने के लिए लिंक करने की आवश्यकता में पाया जाता है (अन्यथा CMake बस परीक्षण कार्यक्रम यह समारोह मौजूद रहने पर परीक्षण करने के लिए उत्पन्न करता है संकलित करने के लिए असफल हो जायेगी)।

CHECK_FUNCTION_EXISTS के साथ यह संभव नहीं है। इसके बजाय CHECK_LIBRARY_EXISTS इस्तेमाल किया जाना चाहिए:

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

अब यह काम और उत्पादन होगा:

-- Looking for clock_gettime in rt - found 

अद्यतन: नए glibc में 2.17+ clock_gettimelibrt से libc ले जाया गया है।

तो तुम दो जांच कर करने की आवश्यकता होगी सभी सिस्टम पर clock_gettime खोजने के लिए सुनिश्चित करने के लिए:

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

यह glibc 2.17 रिलीज के साथ बदल जाएगा । घड़ी_ * प्रतीकों को libc में स्थानांतरित किया जा रहा है और कोड को अब पुस्तकालय के खिलाफ लिंक करने की आवश्यकता नहीं होगी। –

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