我有一些輔助功能,這幫助我找到在文件系統中的共享和靜態庫:CMake的:反覆調用函數使用不同的參數給出了相同的結果
我有執行實際的搜索輔助函數,給定一個name
和suffix
:
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文件,所以不相信這是一個緩存的問題。
我不能確定你的問題是制定優於[一個](http://stackoverflow.com/questions/36757842/cmake-use-foreach-並找到庫返回完整路徑的庫/),14小時前問。爲什麼需要類似的問題? – Tsyvarev