Ответы других участников верны. Лучшее решение - это предоставить список в двойных кавычках:
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 , если вы хотите узнать больше об этом.
Надеюсь, это поможет: -)