zoukankan      html  css  js  c++  java
  • CMake配置工程链接库

    CMake是一款优秀的C/C++项目构建工具。而C/C++项目经常使用一些第三方库,如boost、luajit等。而在CMake下大致有3种方式将C/C++库引入工程。

    find_package
    find_package是CMake原生使用的库查找命令。使用方式如下

    find_package(Boost REQUIRED)
    find_package(SDL2 REQUIRED)
    if(Boost_FOUND) #这些变量的名称没有标准,去CMakeCache.txt里看产生什么变量。
    message(STATUS "found boost")
    endif()
    include_directories(${Boost_INCLUDE_DIRS}) #这个类型变量肯定会有,头文件目录
    target_link_libraries(CruleEngine "${SDL2_IMAGE_LIBRARY}") #这是库的位置 ​
    1
    2
    3
    4
    5
    6
    7
    这个查找主要是在unix下起作用,在windows下几乎没用。它是其实是通过一个.cmake的配置文件,来找到对应的库文件的位置。cmake本身内置了一些知名的库的.cmake配置文件,如boost。
    具体支持哪些,可以通过

    cmake --help-module-list
    1
    或者在下面的网址查看详细信息
    https://cmake.org/cmake/help/v3.0/manual/cmake-modules.7.html
    而想用不支持其他库的话,可以自己去看看别人的项目有没有提供。如果别人有提供,你可以拷贝过来,放到项目目录下,通过下面的方式指定module目录。

    set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/modules/") #工程根目录的modules文件夹下
    1
    find_path & find_library
    这个命令是用来查找包含指定文件的文件夹。比如下面的例子

    find_path(GLIB_INCLUDE NAMES glib.h PATH_SUFFIXES "glib-2.0")
    1
    这里是找glib.h的文件的位置,然后它的位置在/usr/include/glib-2.0目录下,所以我们加了一个搜索前缀glib-2.0来搜索目录。默认情况下,它会搜索系统下面的几个目录,但是有时候也可以指定几个特定路径来搜索。

    find_path(GD_INCLUDE NAMES glib.h PATH_SUFFIXES "glib-2.0"
    PATHS /usr/local /usr/include
    NO_DEFAULT_PATH)
    1
    2
    3
    比如这里的NO_DEFAULT_PATH就是要求不找系统默认的几个目录。而是找PATHS指定的路径。当然如果没有指定搜索目录,会有默认的查找目录,具体查看
    https://cmake.org/cmake/help/v3.0/command/find_path.html

    find_library也是一样。比如找glib2.0的库,示例如下:

    # Linux下
    SET(CMAKE_FIND_LIBRARY_PREFIXES "lib") #设置库的前缀
    SET(CMAKE_FIND_LIBRARY_SUFFIXES ".so" ".a") #设置库的后缀
    find_library(GLIB_LIB NAMES "glib-2.0")
    # Windows下的前后缀
    SET(CMAKE_FIND_LIBRARY_PREFIXES "")
    SET(CMAKE_FIND_LIBRARY_SUFFIXES ".lib" ".dll")
    1
    2
    3
    4
    5
    6
    7
    可以查看
    https://cmake.org/cmake/help/v3.0/command/find_library.htm

    FindPkgConfig
    这个本身是Unix/Linux下的一种库的查找方式,它们可以通过pkg-config命令来找到库文件,它的使用方法如下

    g++ luabind.cpp -o luabind `pkg-config --cflags --libs luajit`
    1
    而CMake也对这种查找方式进行了封装,使用方法如下

    include(FindPkgConfig) #加载FindPkgConfig功能
    pkg_check_modules(XCB xcb REQUIRED) #查找xcb库
    target_link_libraries(app ${XCB_LDFLAGS}) #链接xcb库
    1
    2
    3
    注意这种方式需要库提供pkg索引文件,一般通过Linux包管理安装的库都会带有这个文件。
    其他具体信息可以看
    https://cmake.org/cmake/help/v3.0/module/FindPkgConfig.html

  • 相关阅读:
    jstl 部分标签
    Maven pom.xml 元素配置说明(一)
    spring 参数绑定
    mysql 索引
    ArrayList和HashSet的Contains()方法(转)
    每日记载内容总结44
    剑指offer42:不用加减乘除做加法
    动态规划常见题型
    华为机试-统计每个月兔子的总数
    华为机试-字符串合并处理
  • 原文地址:https://www.cnblogs.com/wangshuyi/p/12155677.html
Copyright © 2011-2022 走看看