CMake命令使用记录

1,find_package命令作用是查找依赖包,下面xxx代表库的名字,有大小写之分

  1. 第一优先级是在CMAKE_MODULE_PATH存储的所有路径中查找Findxxx.cmake文件,在CMakeLists.txt文件中要设置指令:set(CMAKE_MODULE_PATH "Findxxx.cmake文件所在的路径"),如没有设置则使用第二优先级查找。
  2. 第二优先级是在<CMAKE_ROOT>/share/cmake-x.y/Mdodules路径中查找xxxConfig.cmake文件,CMAKE_ROOT是安装cmake时的系统路径,可通过CMAKE_INSTALL_PREFIX制定该路径。
  3. 如果以上两种都没有查到Findxxx.cmake文件,cmake就会进入Config模式,cmake会优先搜索xxx_DIR 指定的路径,在CMakeLists.txt中设置指令:set(xxx_DIR "xxxConfig.cmkae文件所在的路径")
  4. 如没有设置xxx_DIR ,则会在/usr/local/lib/cmake/xxx/中查找xxxConfig.cmake文件
  5. 所以在使用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包

  1. Finddriver.cmake文件可以使用base目录下CMakeLists.txt中定义的变量,所以可以在base的CMakeLists.txt中定义driver包的路径,然后在Finddriver.cmake中通过上面定义的变量再定义driver的头文件路径以及库文件的路径
  2. 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})

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值