1,find_package命令作用是查找依赖包,下面xxx代表库的名字,有大小写之分
- 第一优先级是在CMAKE_MODULE_PATH存储的所有路径中查找Findxxx.cmake文件,在CMakeLists.txt文件中要设置指令:set(CMAKE_MODULE_PATH "Findxxx.cmake文件所在的路径"),如没有设置则使用第二优先级查找。
- 第二优先级是在<CMAKE_ROOT>/share/cmake-x.y/Mdodules路径中查找xxxConfig.cmake文件,CMAKE_ROOT是安装cmake时的系统路径,可通过CMAKE_INSTALL_PREFIX制定该路径。
- 如果以上两种都没有查到Findxxx.cmake文件,cmake就会进入Config模式,cmake会优先搜索xxx_DIR 指定的路径,在CMakeLists.txt中设置指令:set(xxx_DIR "xxxConfig.cmkae文件所在的路径")
- 如没有设置xxx_DIR ,则会在/usr/local/lib/cmake/xxx/中查找xxxConfig.cmake文件
- 所以在使用find_package查找依赖包前,可设置set(base_DIR ${PROJECT_SOURCE_DIR}/src/base)或者set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/src/base)
2,Findxxx.cmake编写,如包名为driver,在base包引用driver包
- Finddriver.cmake文件可以使用base目录下CMakeLists.txt中定义的变量,所以可以在base的CMakeLists.txt中定义driver包的路径,然后在Finddriver.cmake中通过上面定义的变量再定义driver的头文件路径以及库文件的路径
- Finddriver.cmake至少需要定义driver包的头文件目录及库文件路径,如下:
message("the package which use driver path is ${CMAKE_CURRENT_SOURCE_DIR}") # 判断是否定义了包的路径 if(DEFINED DRIVER_DIR) # FIND_PATH(DRIVER_INCLUDE_DIR NAMES serial.h PATHS "${CMAKE_CURRENT_SOURCE_DIR}/include") set(DRIVER_INCLUDE_DIR ${DRIVER_DIR}/include) # 在lib目录下查找lib文件(可多个),并把路径赋给DRIVER_LIBRARY FIND_LIBRARY(DRIVER_LIBRARY NAMES driver_lib.lib PATHS "${DRIVER_DIR}/lib") if(DRIVER_INCLUDE_DIR AND DRIVER_LIBRARY) set(DRIVER_FOUND TRUE) # 如有可个路径对应定义多个变量 set(DRIVER_INCLUDE_DIRS ${DRIVER_INCLUDE_DIR}) set(DRIVER_LIBRARIES ${DRIVER_LIBRARY}) set(DRIVER_LIBS ${DRIVER_LIBRARIES}) mark_as_advanced(DRIVER_FOUND DRIVER_INCLUDE_DIRS DRIVER_LIBRARY_DIRS DRIVER_LIBRARIES DRIVER_LIBS) else() message("not found package driver") endif() endif()
3,要在base包中依赖driver包,其CMakeLists.txt文件应该有一下配置:
cmake_minimum_required (VERSION 3.8)
project ("base")
set(DRIVER_DIR ${PROJECT_SOURCE_DIR}/src/driver)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${DRIVER_DIR})
aux_source_directory(./src ROOT_SRCS)
add_executable (${PROJECT_NAME} ${ROOT_SRCS})
find_package(driver)
if(DRIVER_FOUND)
include_directories(${DRIVER_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${DRIVER_LIBRARIES})
else()
message("can not found driver package ")
endif()
target_link_libraries中库文件的路径是绝对路径,如果要使用相对路径,要在前面通过link_directories指定依赖包driver的库文件存放路径
4,环境变量设置以及获取
set(ENV{APP_PATH} ${PROJECT_SOURCE_DIR}) #设置环境变量
include_directories("$ENV{APP_PATH}/include") #使用环境变量
5,aux_source_directory作用是收集指定目录中所有源文件的名称,并将列表存储在提供的<variable>变量中。如:
aux_source_directory(./src ROOT_SRCS)
aux_source_directory(./include ROOT_INCS)
add_executable (${PROJECT_NAME} ${ROOT_SRCS})
add_library(${PROJECT_NAME} ${ROOT_SRCS} ${ROOT_INCS})