Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMAKE:使用不同参数重复调用函数会得到相同的结果_C++_Cmake - Fatal编程技术网

C++ CMAKE:使用不同参数重复调用函数会得到相同的结果

C++ CMAKE:使用不同参数重复调用函数会得到相同的结果,c++,cmake,C++,Cmake,我有一些帮助函数,可以帮助我在文件系统中定位共享库和静态库: 我有一个助手函数,它执行实际的搜索,给定名称和后缀: 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 lib

我有一些帮助函数,可以帮助我在文件系统中定位共享库和静态库:

我有一个助手函数,它执行实际的搜索,给定
名称
后缀

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()
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()
类似地,函数
find_shared_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()
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)
find_shared_library(protobuf PROTOBUF)
以下是结果输出:

-- search: tcmalloc_minimal.a result: /usr/local/lib/libtcmalloc_minimal.a
-- static lib search: tcmalloc_minimal result: /usr/local/lib/libtcmalloc_minimal.a
-- search: protobuf.so result: /usr/local/lib/libtcmalloc_minimal.a
-- shared lib search: protobuf result: /usr/local/lib/libtcmalloc_minimal.a
第二次使用时,它会断开:

接下来我搜索
protobuf
共享库

find_shared_library(tcmalloc_minimal TCMALLOC)
find_shared_library(protobuf PROTOBUF)
以下是结果输出:

-- search: tcmalloc_minimal.a result: /usr/local/lib/libtcmalloc_minimal.a
-- static lib search: tcmalloc_minimal result: /usr/local/lib/libtcmalloc_minimal.a
-- search: protobuf.so result: /usr/local/lib/libtcmalloc_minimal.a
-- shared lib search: protobuf result: /usr/local/lib/libtcmalloc_minimal.a
错误:

哇?搜索后缀为
protobuf
。因此
将查找以前的搜索结果
/usr/local/lib/libtcmalloc_minimal.a

问题:

  • 为什么会这样
  • 我的函数中有bug吗
  • 要正确搜索所需的库,我需要做什么
注意事项:

我已完成删除生成目录并重新生成生成文件,因此不要认为这是缓存问题。

来自以下文档:

将创建一个名为
的缓存项来存储此命令的结果。
如果找到库,结果将存储在变量中,除非清除变量,否则不会重复搜索

显示必须将变量设置为
FOUND-NOTFOUND
才能清除缓存

set(FOUND FOUND-NOTFOUND)
但是,可以认为这是一种反模式,因为这样做会破坏
查找库的缓存行为

最好为每个唯一的搜索使用唯一的变量名

这里的变量称为
FOUND{LIB\u 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()
从以下文件:

将创建一个名为
的缓存项来存储此命令的结果。
如果找到库,结果将存储在变量中,除非清除变量,否则不会重复搜索

显示必须将变量设置为
FOUND-NOTFOUND
才能清除缓存

set(FOUND FOUND-NOTFOUND)
但是,可以认为这是一种反模式,因为这样做会破坏
查找库的缓存行为

最好为每个唯一的搜索使用唯一的变量名

这里的变量称为
FOUND{LIB\u 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()

我不确定你的问题是否比14小时前提出的更好。为什么需要这个类似的问题?我不确定你的问题是否比14小时前提出的问题表达得更好。为什么需要类似的问题?