您的位置:首页 > 其它

cmake find_package

2017-01-18 16:07 1421 查看
这个命令可以自动搜索库的信息,实际就是生成一些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}

)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: