其他人提供的答案是正确的。最好的解决方案确实是用这样的双引号提供列表:
FindLibs( "${LIBRARY_NAMES_LIST}" )
但是,如果您真的不想强制用户使用双引号,并且还想在宏声明中看到 LIBRARY_NAMES_LIST 参数,我会这样做:
macro( FindLibs LIBRARY_NAMES_LIST )
set( _LIBRARY_NAMES_LIST ${LIBRARY_NAMES_LIST} ${ARGN} ) # Merge them together
message( "inside ${_LIBRARY_NAMES_LIST}" )
endmacro()
它会像这样使用(你的期望):
FindLibs( ${LIBRARY_NAMES_LIST} )
这很好,因为它会强制用户提供至少一个库。像这样称呼它
FindLibs()
行不通。 CMake会报如下错误:
调用 FindLibs 宏时使用了错误的宏,名为:FindLibs
如果您使用 CMake 2.8.3 或更新版本,另一种选择是使用 CmakeParseArguments,但它需要您在列表前面放置一个关键字参数。但这种技术可能是管理多个列表的最简单方法,并且提供了高度的灵活性。因此,知道这一点非常方便。这也是我的首选方式。操作方法如下:
include( CMakeParseArguments )
macro( FindLibs )
set( _OPTIONS_ARGS )
set( _ONE_VALUE_ARGS )
set( _MULTI_VALUE_ARGS NAMES DEPENDS )
cmake_parse_arguments( _FINDLIBS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN} )
# Mandatory
if( _FINDLIBS_NAMES )
message( STATUS "inside NAMES=${_FINDLIBS_NAMES}" )
else()
message( FATAL_ERROR "FindLibs: 'NAMES' argument required." )
endif()
# Optional
if( _FINDLIBS_DEPENDS )
message( STATUS "inside DEPENDS=${_FINDLIBS_DEPENDS}" )
endif()
endmacro()
不幸的是,您必须自己执行参数强制,但至少它让您可以选择哪些参数是强制性的,哪些不是(DEPENDS 在我上面的示例中是可选的)。
它会这样使用:
FindLibs( NAMES ${LIBRARY_NAMES_LIST} )
FindLibs( NAMES ${LIBRARY_NAMES_LIST} DEPENDS ${LIBRARY_DEPENDENCY_LIST} )
# You can change the order
FindLibs( DEPENDS ${LIBRARY_DEPENDENCY_LIST} NAMES ${LIBRARY_NAMES_LIST} )
# You can even build your lists on the fly
FindLibs(
NAMES
zlib
png
jpeg
DEPENDS
otherProject1
otherProject2
)
如果我这样做:
FindLibs()
# or that:
FindLibs( DEPENDS ${LIBRARY_DEPENDENCY_LIST} )
然后我会收到我的自定义错误消息:
错误:FindLibs:需要“NAMES”参数。
如果您想了解更多信息,请点击这里指向 CMakeParseArguments 文档的链接。
希望对你有帮助:-)