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的当前目录就是上一级目录.
  • 最后执行.

原文地址:https://www.cnblogs.com/loop0day/p/8719314.html

时间: 2024-10-31 10:08:18

CMake的简单使用(二) - 链接依赖库的相关文章

mingw qt(可以去掉mingwm10.dll、libgcc_s_dw2-1.dll、libstdc++-6.dll的依赖,官方的mingw默认都是动态链接gcc的库而TDM是静态链接gcc库,tdm版本更好用)

原文地址:mingw qt作者:孙1东 不使用Qt SDK,使用mingw编译qt源代码所遇问题及解决方法: configure -fast -release -no-exceptions -no-rtti -no-stl -no-qt3support -no-opengl -no-multimedia -no-webkit -no-script -no-scripttools -nomake tools -nomake examples -nomake demos -nomake docs -

jitpack让使用第三方依赖库更简单

在开发过程中,使用第三方优秀依赖库是个很常见的问题,有的时候是maven,或者gradle, 或者sbt,大部分库工程,都会有对应的gradle,maven依赖代码,但是有的没有,尤其是使用的snapshot的依赖的时候,虽然有源代码可以自己down下来,然后源码级别的依赖,或者自己导出jar包依赖,这个时候,神器jitpack就出现了. 使用灰常简单,去jitpack官网: <a href="https://jitpack.io/">点这里</a> 以Gith

调用MyFocus库,简单实现二十几种轮播效果

一.首先点击这里下载myFocus库文件,标准文件库就行了,很小仅仅1.4M. myFocus库有以下的好处: a . 文件小巧却高效强大,能够实现二十几种轮播的效果. b . 极其简单的使用,只需要调用就可以使用,下面会介绍方法. c . 灵活的设置,很多参数可以提供设置,比如不想要文字提示,设置高度为0....更多参数适用请见网站教程页面. 二.下载下来之后,解压,看到一个文件夹,如下图所示: 对此文件夹进行一下说明:a . 打开js文件夹,然后有个js文件,就是我们最开始要调用的myfoc

cmake 强制链接静态库

add_executable(main main.cpp) target_link_libraries(main ${CMAKE_SOURCE_DIR}/libbingitup.a) 静态库和动态库共存时,cmake会默认先链接静态库,如果要强制使用静态库,在CMakeLists.txt中如此直接指明 或者这样做也可以 So, if you want to link to a static library, you need to search for that static library:

VSLAM依赖库版本配置(CMake)

在开发VSLAM程序的过程中,我需要不断地学习开源程序,如ORB-SLAM2.SVO.LSD-SLAM.DSO.LearnVIORB.ygz-stereo-inertial.svo_degelet.ORB-TGZ-SLAM等等,其中依赖的库较多,主要的有OpenCV.g2o.eigen3.Sophus等. 不同的程序使用的版本往往不一样,由于需要学习不同的开源程序并转化为自己的知识,进而开发自己的 程序,因此,无法在ubuntu系统中安装一个版本适应所有开源程序.因此,需要配置选择安装于系统之外

Linux链接库二(动态库,静态库,库命名规则,建立个没有版本号的软连接文件)

http://www.cppblog.com/wolf/articles/74928.html http://www.cppblog.com/wolf/articles/77828.html http://www.jb51.net/article/34990.htm 1.概念和区别:    静态库就是在编译过程中一些目标文件的集合.静态库在程序链接的时候使用,链接器会将程序中使用到函数的代码从库文件中拷贝到应用程序中.一旦链接完成,在执行程序的时候就不需要静态库了.     由于每个使用静态库的

VS2012中使用CEGUI项目发布到XP平台的问题(核心方法就一句话。“你项目使用的所有外部依赖库都用/MT编译。”)

接着上一篇文章,详细说说如何把一个带CEGUI的项目发布到XP平台. 这个问题纠缠了我好几天.这里把详细解决思路记下来.有同样问题的朋友可以少走很多弯路. 核心方法就一句话.“你项目使用的所有外部依赖库都用/MT编译.” 1.准备. 首先你要具备如下工具:CEGUI源码:FreeType源码:Pcre源码:CMake工具.我会在下文说明原因. 各个开源库的版本号,请参考你的CEGUI引用的各自的头文件分别下载. FreeType开源库主页:http://sourceforge.net/proje

android studio依赖库工程Activity显示问题及库工程设置

android studio引用库工程其实不难,直接添加依赖module即可,但是我在操作过程中出现一些奇怪的问题,苦扰我一整天,为了祭奠这苦命的一天特别mark一下. 首先描述一下我的错误现象: studio配置完成后我就迫不及待的创建了一个项目,然后把以前用的库工程(eclipse工程)导入到studio中,然后创建一个项目引用一下看看效果咋样,以下分别描述两个项目遇到的问题: 出现问题: 1.调用库工程方法正常,但是在运行的时候提示我启动图标错误,原因是库工程和项目工程设置的启动图标指向同

CMake入门——简单CMakeLists的编写

CMake简介: CMake是一种跨平台的开源项目管理工具,所做的事其实就是告诉编译器如何去编译链接源代码.与之相似的是直接编写makefile文件,但makefile最大的缺点就是不能跨平台,一旦更换环境就要重新编写,于是我们可以使用CMake编写CMakeLists文件来解决此问题. 检查是否安装CMake 首先检查是否安装CMake,在终端输入cmake --version来检查,若显示未安装,可以使用sudo apt-get install camke ( ubuntu),或者brew