cmake find_package


这个命令可以自动搜索库的信息,实际就是生成一些cmake变量导入当前的CMakeLists.txt
其依赖于一个事先编译好的findXX.cmake文件,而且一般官方给出了很多,不需要自己编写
此处只是利用这个findXX.cmake节省一些编码工作

比如gflags事先已经编译好,放在c:\gflags目录下,现在一个工程需要引用它,为了避免每次配置gflag,编写一个如下的findGFLAGS.cmake文件

#findXX.cmake就输出三个变量,命名方法不是规定的,但是有约定
set(GFLAGS_FOUND FALSE)
set(GFLAGS_INCLUDE_DIR "")
set(GFLAGS_LIBRARIES "")

#查找头文件路径
FIND_PATH(GFLAG_INC
    NAMES
    gflags.h
    PATHS
    c:/gflags/)

#查找库文件
FIND_LIBRARY(GFLAGS_LIB
    NAMES
    gflags.lib
    PATHS
    c:/gflags/x64 )
#保存结果到指定变量
list(APPEND GFLAGS_LIBRARIES ${GFLAGS_LIB})
list(APPEND GFLAGS_INCLUDE_DIR ${GFLAG_INC})
#生成变量,确定是查找陈工
IF(GFLAGS_LIBRARIES AND GFLAGS_INCLUDE_DIR)
    set(GFLAGS_FOUND true)
ENDIF()

################
#实验中发现问题
#输出变量要用set或list方式赋值,否则无法导出,原因不详
#比如下面的赋值,虽然也有一个GFLAGS_INCLUDE_DIR,但是无法导出
#FIND_PATH(GFLAGS_INCLUDE_DIR
#    NAMES
#    gflags.h
#    PATHS
#    c:/gflags/)
#其实对于这种简单场景,直接下面的语句也可以
#set(GFLAGS_INCLUDE_DIR GFLAGS_INCLUDE_DIR)
#但是list方式在导出的库不止一个时很有用


导入时,在CMakeLists.txt中指定模块目录 假设findGFLAGS.cmake放在c:\cmakeFinds中
set(CMAKE_MODULE_PATH c:/cmakeFinds)

find_package(GFLAGS REQUIRED)

if (NOT GFLAGS_FOUND)
    message("miss gflags")
endif()


#导入gflags头文件路径
INCLUDE_DIRECTORIES(.
${GFLAGS_INCLUDE_DIR})
#导入gflags库
TARGET_LINK_LIBRARIES(${PROJECT_NAME}
${GFLAGS_LIBRARIES}
)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值