2016-04-21 20 views
1

我有一些輔助功能,這幫助我找到在文件系統中的共享和靜態庫:CMake的:反覆調用函數使用不同的參數給出了相同的結果

我有執行實際的搜索輔助函數,給定一個namesuffix

function(do_find_lib LIB_NAME SUFFIX OUT) 

    set(CMAKE_FIND_LIBRARY_SUFFIXES ${SUFFIX}) 

    find_library(FOUND ${LIB_NAME}) 

    if(NOT FOUND) 
     message(SEND_ERROR "unable to find library ${LIB_NAME}") 
    endif() 

    message(STATUS "search: ${LIB_NAME}.${SUFFIX} result: ${FOUND}") 

    set(${OUT} ${FOUND} PARENT_SCOPE) 

endfunction() 

find_static_lib設置相應的後綴,並調用該函數do_find_lib

function(find_static_lib LIB_NAME OUT) 

    if (WIN32 OR MSVC) 
     set(SUFFIX ".lib") 
    elseif (UNIX) 
     set(SUFFIX ".a") 
    endif()  

    do_find_lib(${LIB_NAME} ${SUFFIX} FOUND) 

    message(STATUS "static lib search: ${LIB_NAME} result: ${FOUND}") 

    set(${OUT} ${FOUND} PARENT_SCOPE) 

endfunction() 

同樣,find_shared_lib設置相應的後綴,並調用函數do_find_lib

function(find_shared_lib LIB_NAME OUT) 

    if (WIN32 OR MSVC) 
     set(SUFFIX ".dll") 
    elseif (UNIX) 
     set(SUFFIX ".so") 
    endif()  

    do_find_lib(${LIB_NAME} ${SUFFIX} FOUND) 

    message(STATUS "shared lib search: ${LIB_NAME} result: ${FOUND}") 

    set(${OUT} ${FOUND} PARENT_SCOPE) 

endfunction() 

根據需要,在我的cmake層次別處我使用這些功能來找到各種庫

我第一次使用它的工作原理如下:

首先我搜索了tcmalloc靜態庫。

find_shared_library(tcmalloc_minimal TCMALLOC) 

下面是所得到的輸出:

-- search: tcmalloc_minimal.a result: /usr/local/lib/libtcmalloc_minimal.a 
-- static lib search: tcmalloc_minimal result: /usr/local/lib/libtcmalloc_minimal.a 

我用它的第二個時間,它打破:

接着我搜索protobuf共享庫。

find_shared_library(protobuf PROTOBUF) 

下面是所得到的輸出:

-- search: protobuf.so result: /usr/local/lib/libtcmalloc_minimal.a 
-- shared lib search: protobuf result: /usr/local/lib/libtcmalloc_minimal.a 

錯誤:

華?搜索protobuf後綴.so找到以前的搜索結果,/usr/local/lib/libtcmalloc_minimal.a

問:

  • 這究竟是爲什麼?
  • 我的功能有問題嗎?
  • 我需要做什麼才能正確搜索必要的庫?

注:

我已經完成刪除了我的build目錄和重建makefile文件,所以不相信這是一個緩存的問題。

+4

我不能確定你的問題是制定優於[一個](http://stackoverflow.com/questions/36757842/cmake-use-foreach-並找到庫返回完整路徑的庫/),14小時前問。爲什麼需要類似的問題? – Tsyvarev

回答

0

從文檔上find_library

A cache entry named by <VAR> is created to store the result of this command.
If the library is found the result is stored in the variable and the search will not be repeated unless the variable is cleared.

This cmake mailing list answer說明你的變量設置爲FOUND-NOTFOUND,以清除緩存。

set(FOUND FOUND-NOTFOUND) 

但是,可以說,這是一個反模式,因爲這樣做違背了find_library

緩存行爲這將是更好地使用了獨特的可變名每個獨特的搜索。

這裏變量稱爲FOUND_${LIB_NAME}${SUFFIX}

function(do_find_lib LIB_NAME SUFFIX OUT) 

    set(CMAKE_FIND_LIBRARY_SUFFIXES ${SUFFIX}) 

    find_library(FOUND_${LIB_NAME}${SUFFIX} ${LIB_NAME}) 

    if(NOT FOUND_${LIB_NAME}${SUFFIX}) 
     message(SEND_ERROR "unable to find library ${LIB_NAME}") 
    endif() 

    set(${OUT} ${FOUND_${LIB_NAME}${SUFFIX}} PARENT_SCOPE) 

endfunction() 
相關問題