CMake的简单使用 - 链接依赖库

Posted loop0day

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMake的简单使用 - 链接依赖库相关的知识,希望对你有一定的参考价值。

  • 这里我引入的依赖库是ncurses, 用的是ncurses的HelloWorld例子. (具体的编译ncurses过程这里不再赘述)
  • 先把目录结构罗列下.
  • 技术分享图片
  • 深层次的我就不继续展开了, 都是编译生成的头文件和库文件.
  • 接下来先看下我们的HelloWorld.c
  •  1 /*
     2  * Filename     : HelloWorld.c
     3  * Description  : a CMake ncurses demo
     4  * Author       : loop0day
     5  * Created      : 2018 Apr 04 08:42:58 PM
     6  * Modified     : 2018 Apr 04 08:42:58 PM
     7  */
     8 
     9 #include <ncurses/ncurses.h>
    10 
    11 /* main */
    12 int main();
    13 
    14 int
    15 main()
    16 {
    17   /* start cursor mode */
    18   initscr();
    19   /* print */
    20   printw("Hello World!");
    21   /* flush buffer */
    22   refresh();
    23   /* wait user input */
    24   getch();
    25   /* end cursor mode */
    26   endwin();
    27 
    28   return 0;
    29 }

     

  • 基本上没什么好说的, 注意一下我们包含头文件的时候使用的是尖括号.
  • 接下来看CMakeLists.txt
  •  1 # set cmake minimum required version cmake to build this project
     2 cmake_minimum_required(VERSION 3.9)
     3 
     4 # set project name
     5 project(HelloWorld)
     6 
     7 # add MACRO for ncurse
     8 add_definitions(-D_GNU_SOURCE -D_DEFAULT_SOURCE)
     9 
    10 # search ncurse headers
    11 find_path(NCURSES_PATH ncurses/ncurses.h)
    12 
    13 # search ncurses library
    14 find_library(NCURSES_LIB ncurses HINTS ncurses)
    15 
    16 # define a executable target
    17 add_executable(HelloWorld HelloWorld.c)
    18 
    19 # include with ncurses
    20 target_include_directories(HelloWorld PRIVATE ${NCURSES_PATH})
    21 
    22 # link with ncurses
    23 target_link_libraries(HelloWorld ${NCURSES_LIB}
  • 第一个命令依旧指定构建这个项目所需要的最小CMake版本.
  • 第二个命令指定项目的名称.
  • 第三个命令是指定相关的预编译宏, 这些宏用于配置ncurses库.
  • 第四个命令 find_path 用于在指定目录查找目标头文件, 然后扩展成绝对路径赋值给第一个变量参数, 这个指定目录可以用 cmake -DCMAKE_PREFIX_PATH=<path> 进行覆盖, 如果没有找到就到默认的地方查找, 这里由于我将ncurses的头文件存放在了include目录下的ncurses目录中, 但是指定的CMAKE_PREFIX_PATH却是项目的最顶层, 所以需要在查找的时候添加一个子目录, 这样查找就会被扩展成${CMAKE_PREFIX_PATH}/include/ncurses/ncurses.h.
  • find_library 类似, 用于查找所需要的库.
  • 然后我通过HINTS指定子目录(不知道为什么不能直接在name上指定子目录, cmake不通过, 网上也没有查找到原因, 还望知道的朋友告知下, 谢谢了).
  • 然后 add_executable 指定一个可执行的目标, 这样这个目标才能对下面的链接操作可见.
  • target_include_directories 用于给目标添加头文件目录,不过这里多了一个必须指定的限定符, 限定符的种类有INTERFACE, PRIVATE, PUBLIC. 具体区别如下(摘自https://stackoverflow.com/questions/26037954/cmake-target-link-libraries-interface-dependencies).
  • If you are creating a shared library and your source cpp files #include the headers of another library (Say, QtNetwork for example), but your header files don‘t include QtNetwork headers, then QtNetwork is a PRIVATE dependency.

    If your source files and your headers include the headers of another library, then it is a PUBLIC dependency.

    If your header files but not your source files include the headers of another library, then it is an INTERFACE dependency.

  •  target_link_libraries 指定链接的库, 默认是链接动态库, 不过可以强制指定静态库.
  • 老方法, 进入build目录进行构建.
  • 注意的是, 构建的时候使用 cmake -DCMAKE_PREFIX_PATH=. .. , CMAKE_PREFIX_PATH的当前目录是相对于cmake的工作目录的, 这里的工作目录是父目录, 所以CMAKE_PREFIX_PATH的当前目录就是上一级目录.
  • 最后执行.



以上是关于CMake的简单使用 - 链接依赖库的主要内容,如果未能解决你的问题,请参考以下文章

CMAKE将动态库链接到模块,但不显示为链接依赖

Cmake 库依赖关系的传递

使用 Cmake 创建一个依赖于 dlib 的共享库

如何在 CMake 中正确创建目标之间的依赖关系?

CMake和静态库顺序

使用 cmake 如何静态链接一些库和动态链接其他库?