我有一些辅助函数可以帮助我找到文件系统中的共享库和静态库:
我有一个辅助函数,可以执行实际搜索,给定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
的{{1}}会找到上一个搜索结果.so
问题:
备注:
我已经完成删除了我的构建目录并重建了makefile,所以不要相信这是缓存的问题。
答案 0 :(得分:0)
来自find_library
的文档:
创建由
<VAR>
命名的缓存条目以存储此命令的结果 如果找到库,则结果存储在变量中,除非清除变量,否则不会重复搜索。
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()