在项目中我们可能或多多少需要引用第三方库及它的头文件,这个时候可以创建一个.cmake文件,去查找相应的第三方库;
在顶层CMakeLists.txt添加如下语句:
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/common/3rdparty)
其中CMAKE_MODULE_PATH变量是我们存放第三方库cmake的路径,后面是具体路径。
以下是我的FindALSA.cmake
FIND_PATH(ALSA_INCLUDE_DIR asoundlib.h
PATHS
/usr/local/include/alsa
/usr/include/alsa
/opt/local/include
/opt/include
)
get_filename_component(ALSA_INCLUDE_DIR ${ALSA_INCLUDE_DIR} ABSOLUTE)
FIND_LIBRARY(ALSA_LIBRARY asound
/usr/local/lib
/usr/lib
)
IF (ALSA_INCLUDE_DIR)
IF (ALSA_LIBRARY)
SET(ALSA_FOUND "YES")
ENDIF (ALSA_LIBRARY)
ENDIF (ALSA_INCLUDE_DIR)
MARK_AS_ADVANCED(
ALSA_INCLUDE_DIR
ALSA_LIBRARY
ALSA_FOUND
)
其中asoundlib.h是我使用libasound这个库所需的头文件。
其中get_filename_component(ALSA_INCLUDE_DIR ${ALSA_INCLUDE_DIR} ABSOLUTE)表示我使用绝对路径。
然后CMakeLists.txt如下:
find_package(ALSA REQUIRED)
if (ALSA_FOUND)
message(STATUS "Found ALSA installed in the system")
message(STATUS " - Includes: ${ALSA_INCLUDE_DIR}")
message(STATUS " - Libraries: ${ALSA_LIBRARY}")
target_link_libraries(${PROJECT_NAME} asound)
else ()
message(STATUS "Cannot Find ALSA")
endif (ALSA_FOUND)
上述还是比较适合一些基础的库,特别是在电脑中运行,特别注意的是因为我使用的是交叉编译所以它搜寻的路径为交叉编译链路径下的sys-root路径下。
因为交叉编译设置啦库和头文件搜寻的路径:
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
我的打印信息如下:
-- Found ALSA installed in the system
-- - Includes: /root/4.9.3/arm-cortexa9-linux-gnueabihf/sys-root/usr/include/alsa
-- - Libraries: /root/4.9.3/arm-cortexa9-linux-gnueabihf/sys-root/usr/lib/libasound.so