zoukankan      html  css  js  c++  java
  • cmake 学习笔记(三) (转)

    接前面的 Cmake学习笔记()  Cmake学习笔记() 继续学习 cmake 的使用

    学习一下cmake finder

    finder是神马东西

    当编译一个需要使用第三方库的软件时,我们需要知道

    去哪儿找头文件 .h

    对比GCC -I 

    去哪儿找库文件 (.so/.dll/.lib/.dylib/...)

    对比GCC -L 

    需要链接的库文件的名字

    对比GCC -l 

    这也是一个 finder 需要返回的最基本的信息

    如何使用?

    比如说,我们需要一个第三方库 curl,那么我们的 CMakeLists.txt 需要指定头文件目录,和库文件,类似

    include_directiories(/usr/include)

    target_link_libraries(myprogram curl)

    如果借助于cmake提供的finder会怎么样呢?使用cmakeModules目录下的FindCURL.cmake,相应的 CMakeList.txt 文件

    find_package(CURL REQUIRED)

    include_directories(${CURL_INCLUDE_DIR})

    target_link_libraries(curltest ${CURL_LIBRARY})

    find_package(CURL)

    if(CURL_FOUND)

    include_directories(${CURL_INCLUDE_DIR})

    target_link_libraries(curltest ${CURL_LIBRARY})

    else(CURL_FOUND)

    message(FATAL_ERROR "curl not found!")

    endif(CURL_FOUND)

    如果我们使用的finder,不是cmake自带的怎么办

    • 放置位置:工程根目录下的 cmake/Modules/
    • 然后在 CMakeList.txt 中添

    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")

    find_package如何工

    find_package 将会在module路径下查找 Find<name>.cmake。首先它搜索 ${CMAKE_MODULE_PATH}中的所有路径,然后搜索 <CMAKE_ROOT>/share/cmake-x.y/Modules/

    如果这个文件未找到,它将会查找 <Name>Config.cmake <lower-case-name>-config.cmake 文件。这两个文件是库文件安装时自己安装的,将自己的路径硬编码到其中

    前者称为 module 模式,后者称为 config

    每个模块一般都会提供一下几个变

    • <name>_FOUND
    • <name>_INCLUDE_DIR <name>_INCLUDES
    • <name>_LIBRARY <name>_LIBRARIES <name>_LIBS
    • <name>_DEFINITIONS

    编写finder

    • 首先使用 find_package 探测本软件包依赖的第三方库(参数 QUIETLY REQUIRED应该被传递)
    • 如果 pkg-config 可用,则可以用其去探测include/library
    • 分别使用 find_path find_library 查找头文件和库文
      • pkg-config 提供的路径仅作为参
      • CMake 有很多硬编码的路
      • 结果放到 <name>_INCLUDE_DIR <name>_LIBRARY (注意:单数而不是复数)
    • 设置 <name>_INCLUDE_DIRS <name>_INCLUDE_DIR <dependency1>_INCLUDE_DIRS ...
    • 设置 <name>_LIBRARIES <name>_LIBRARY <dependency1>_LIBRARIES ...
      • 依赖使用复数,包自身使用单数形式(由find_pathfind_library提供)
    • 调用宏 find_package_handle_standard_args() 设置 <name>_FOUND 并打印或失败信息

    From: http://blog.csdn.net/dbzhang800/article/details/6329314

  • 相关阅读:
    又到一年高考时
    嵌套母版页中的控件访问
    用临时表改善嵌套SQL语句的执行速度
    利用图片进行定位
    CSS样式嵌套
    触摸MVP
    抱SQL SERVER大腿之从巨大表中提炼非重复数据
    用参数来控制用户控件的缓存
    Understand static/global data completely in C++
    VS资源(基础)
  • 原文地址:https://www.cnblogs.com/time-is-life/p/7009643.html
Copyright © 2011-2022 走看看