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小时前提出的问题表达得更好。为什么需要类似的问题?