2012-12-06 29 views
5

どうすればCHECK_FUNCTION_EXISTSが見つからないclock_gettimeなぜCMakeでCHECK_FUNCTION_EXISTSがclock_gettimeを見つけられないのですか?

私は私のCMakeLists.txtに次のコードを使用します。

include(CheckFunctionExists) 

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

これは私がclock_gettimeを持って知っているPOSIXシステムです。しかし、私は単純に取得:clock_gettimeは、私たちは、チェックを行う際にそれにリンクする必要がlibrtで発見され

-- Looking for clock_gettime - not found 

答えて

7

ので(そうでない場合は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_gettimelibclibrtから移動されました。

ですから、2つのチェックを行うために必要となるすべてのシステムで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リリースで変更されます。 clock_ *シンボルはlibcに移動され、コードはもはやlibrtにリンクする必要はありません。 –

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