Cmake:在findALSA.cmake示例中

时间:2011-08-10 23:41:17

标签: cmake

为了理解如何链接库,有人建议我查看以下的findALSA示例:

find_path(ALSA_INCLUDE_DIR NAMES asoundlib.h
          PATH_SUFFIXES alsa
          DOC "The ALSA (asound) include directory"
)

find_library(ALSA_LIBRARY NAMES asound
          DOC "The ALSA (asound) library"
)

# handle the QUIETLY and REQUIRED arguments and set ALSA_FOUND to TRUE if 
# all listed variables are TRUE
include("${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake")
FIND_PACKAGE_HANDLE_STANDARD_ARGS(ALSA DEFAULT_MSG ALSA_LIBRARY ALSA_INCLUDE_DIR)

if(ALSA_FOUND)
  set( ALSA_LIBRARIES ${ALSA_LIBRARY} )
  set( ALSA_INCLUDE_DIRS ${ALSA_INCLUDE_DIR} )
endif()

mark_as_advanced(ALSA_INCLUDE_DIR ALSA_LIBRARY)

我不明白的是:

if(ALSA_FOUND)
  set( ALSA_LIBRARIES ${ALSA_LIBRARY} )
  set( ALSA_INCLUDE_DIRS ${ALSA_INCLUDE_DIR} )
endif()

问题1:这是因为${ALSA_LIBRARY}${ALSA_INCLUDE_DIR}只能指向单个文件/单个目录吗?

问题2:如果我想链接2个包含目录和2个库文件,有人可以告诉我如何重写示例吗?

假设我们有以下示例:

/alsa/dir1/asound1.h
/alsa/dir2/asound2.h
/alsa/lib/libasound1.a
/alsa/lib/libasound2.a

问题3:特别是FIND_PACKAGE_HANDLE_STANDARD_ARGS命令变成了什么?

非常感谢

1 个答案:

答案 0 :(得分:1)

  1. 是的,ASLI_LIBRARIES将结合这些。
  2. 2& 3:在find_package_handle_standard_args中仅定义程序包正常工作所需的内容。以下代码适用于所有需要的时间。

    find_path(ALSA_INCLUDE_DIR1 NAMES asound1.h
              PATH_SUFFIXES alsa
              DOC "The ALSA (asound) include directory 1"
    )
    
    find_path(ALSA_INCLUDE_DIR2 NAMES asound2.h
              PATH_SUFFIXES alsa
              DOC "The ALSA (asound) include directory 2"
    )
    
    find_library(ALSA_LIBRARY2 NAMES asound1
              DOC "The ALSA (asound) library 1"
    )
    
    find_library(ALSA_LIBRARY2 NAMES asound2
              DOC "The ALSA (asound) library 2"
    )
    
    # handle the QUIETLY and REQUIRED arguments and set ALSA_FOUND to TRUE if 
    # all listed variables are TRUE
    include("${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake")
    FIND_PACKAGE_HANDLE_STANDARD_ARGS(ALSA DEFAULT_MSG ALSA_LIBRARY1 ALSA_LIBRARY2 ALSA_INCLUDE_DIR1 ALSA_INCLUDE_DIR2)
    
    if(ALSA_FOUND)
      set( ALSA_LIBRARIES ${ALSA_LIBRARY1} ${ALSA_LIBRARY2} )
      set( ALSA_INCLUDE_DIRS ${ALSA_INCLUDE_DIR1} ${ALSA_INCLUDE_DIR2} )
    endif()
    
    mark_as_advanced(ALSA_INCLUDE_DIR ALSA_LIBRARY)