CMAKE:使用不同参数重复调用函数会产生相同的结果

时间:2016-04-21 14:49:42

标签: c++ 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的{​​{1}}会找到上一个搜索结果.so

问题:

  • 为什么会这样?
  • 我的功能中有错误吗?
  • 如何才能正确搜索必备库?

备注:

我已经完成删除了我的构建目录并重建了makefile,所以不要相信这是缓存的问题。

1 个答案:

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