介绍#

继续展示一个hello world示例,它首先创建并链接一个静态库。这是一个简化示例,这里的库和二进制文件在同一个文件夹中。通常,这些将会被放到子项目中,这些内容将会在以后描述。

本教程中的文件如下:

$ tree
.
├── CMakeLists.txt
├── include
│   └── static
│       └── Hello.h
└── src├── Hello.cpp└── main.cpp
  • [CMakeLists.txt] - 包含你希望运行的 CMake 命令

    cmake_minimum_required(VERSION 3.5)project(hello_library)############################################################
    # Create a library
    #############################################################Generate the static library from the library sources
    add_library(hello_library STATIC src/Hello.cpp
    )target_include_directories(hello_libraryPUBLIC ${PROJECT_SOURCE_DIR}/include
    )############################################################
    # Create an executable
    ############################################################# Add an executable with the above sources
    add_executable(hello_binary src/main.cpp
    )# link the new hello_library target with the hello_binary target
    target_link_libraries( hello_binaryPRIVATE hello_library
    )
    
  • [include/static/Hello.h] - 要包含的头文件

    #ifndef __HELLO_H__
    #define __HELLO_H__class Hello
    {
    public:void print();
    };#endif
    
  • [src/Hello.cpp] - 要编译的源文件

    
    #include <iostream>#include "static/Hello.h"void Hello::print()
    {std::cout << "Hello Static Library!" << std::endl;
    }
    
  • [src/main.cpp] - 主源文件

    #include "static/Hello.h"int main(int argc, char *argv[])
    {Hello hi;hi.print();return 0;
    }
    

概念#

添加静态库#

add_library()功能用于从某些源文件创建库。调用方式如下:

add_library(hello_library STATICsrc/Hello.cpp
)

此命令将使用add_library()调用中的源代码创建一个名为libhello_library.a的静态库

添加头文件目录#

在本例中,我们使用target_include_directory()函数将include目录包含在库中,并将范围设置为PUBLIC。

target_include_directories(hello_libraryPUBLIC${PROJECT_SOURCE_DIR}/include
)

这将导致包含的目录在以下位置使用:

  • 在编译该库时
  • 在编译链接至该库的任何其他目标时。

作用域的含义是:

  • PRIVATE - 将目录添加到此目标的include目录中
  • INTERFACE - 将该目录添加到任何链接到此库的目标的include目录中(不包括自己)。
  • PUBLIC - 它包含在此库中,也包含在链接此库的任何目标中。
#include "static/Hello.h"

链接库#

在创建使用库的可执行文件时,你必须告诉编译器有关库的信息。这可以使用target_link_library()函数来完成。

add_executable(hello_binarysrc/main.cpp
)target_link_libraries( hello_binaryPRIVATEhello_library
)

这告诉CMake在链接时将hello_library与hello_binary可执行文件链接起来。它还将从hello_library传递任何具有PUBLIC或INTERFACE作用范围的include目录到hello_binary。

编译器调用它的一个示例是:

/usr/bin/c++ CMakeFiles/hello_binary.dir/src/main.cpp.o -o hello_binary -rdynamic libhello_library.a

构建示例#

$ mkdir build$ cd build$ cmake ..
-- The C compiler identification is GNU 4.8.4
-- The CXX compiler identification is GNU 4.8.4
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/matrim/workspace/cmake-examples/01-basic/C-static-library/build$ make
Scanning dependencies of target hello_library
[ 50%] Building CXX object CMakeFiles/hello_library.dir/src/Hello.cpp.o
Linking CXX static library libhello_library.a
[ 50%] Built target hello_library
Scanning dependencies of target hello_binary
[100%] Building CXX object CMakeFiles/hello_binary.dir/src/main.cpp.o
Linking CXX executable hello_binary
[100%] Built target hello_binary$ ls
CMakeCache.txt  CMakeFiles  cmake_install.cmake  hello_binary  libhello_library.a  Makefile$ ./hello_binary
Hello Static Library!

CMake基础 第3节 静态库相关推荐

  1. CMake基础 第4节 动态库

    介绍# 继续展示一个hello world示例,它将首先创建并链接一个共享库. 这里还显示了如何创建别名目标 本教程中的文件如下: $ tree . ├── CMakeLists.txt ├── in ...

  2. Linux基础——gcc编译、静态库与动态库(共享库)

    Linux基础--gcc编译.静态库与动态库(共享库) https://blog.csdn.net/daidaihema/article/details/80902012 Linux基础--gcc编译 ...

  3. cmake学习(一)静态库与动态库构建

    (.so)共享库,shared object:节省空间,在运行时去连接,如果执行机器上没有这些库文件就不能执行. (.a)静态库,archive:静态库和程序化为一体,不会分开. 通过 ldd命令可以 ...

  4. Xshell 基础命令及其打包静态库和动态库命令

    open ------- 打开链接服务器  clear------------清屏 ls    ----------查看文件目录 ls -all --------查看所有的文件目录 rm -rf  n ...

  5. CMake基础 第8节 包含第三方库

    介绍# 几乎所有重要的项目都需要包含第三方库.头文件或程序.CMake支持使用find_package()函数查找这些工具的路径.这将从CMAKE_MODULE_PATH中的文件夹列表中搜索格式为Fi ...

  6. CMake基础 第7节 编译标志

    引言# CMake支持以多种不同方式设置编译标志: 使用target_compile_definitions()函数 使用CMAKE_C_FLAGS和CMAKE_CXX_FLAGS变量. 本教程中的文 ...

  7. CMake基础 第5节 安装项目

    介绍# 此示例说明如何生成make install目标以在系统上安装文件和二进制文件.这基于前面的共享库示例. 本教程中的文件如下: $ tree . ├── cmake-examples.conf ...

  8. CMake基础 第2节 分离编译

    介绍# 展示一个hello world示例,它使用不同的文件夹来存储源文件和头文件. 本教程中的文件包括: B-hello-headers$ tree . ├── CMakeLists.txt ├── ...

  9. CMake基础 第1节 初识CMake

    介绍# 本节展示一个非常基本的hello world的例子. 本节中的文件如下: A-hello-cmake$ tree . ├── CMakeLists.txt ├── main.cpp [CMak ...

最新文章

  1. FPGA之异步时钟、同步时钟并存同步问题
  2. mysql dump xtrabackup_MySQL--备份恢复【Mysqdump+xtrabackup(XBK)】
  3. Python 的电子邮件编程
  4. 「会会」产品体验报告
  5. linux cut性能,Linux cut
  6. python --- 使用socket创建tcp服务
  7. TODO-MVP-Loaders源码体验
  8. 听听【八年阿里架构师】怎样讲述Dubbo和Spring Cloud微服务架构
  9. 十几款应用广泛的第三方URL解析库被曝8个漏洞
  10. 平衡二叉树建立、实现和判断
  11. Shell 相互调用
  12. Confluence 6 你模板中可用的对象
  13. java 英语简历模板下载 百度云_java软件工程师英文简历模板下载
  14. 2022年低压电工考试题库及模拟考试
  15. ROS 5.24软路由系统 安装+部署+联网 参考教程(ISO版)
  16. Unity (三) NavMeshAgent之:分层路面导航(王者荣耀,英雄联盟中小兵分三路进攻敌方)...
  17. 影片:天空上尉与明日世界
  18. 钕铁硼表面处理之—钝化
  19. Linux 平台下如何使用GCC得到各种格式的文件正文(office文件,PDF,邮件,html,zip等)
  20. h5获取浏览器的相机和摄像头权限

热门文章

  1. laravel 安装随笔
  2. 树的先序遍历的栈实现
  3. Android攻城狮Gallery和ImageSwitcher制作图片浏览器
  4. WEB接口测试之Jmeter接口测试自动化 (二)(数据分离)
  5. SQL注入 1-3_基于post报错注入
  6. [知识图谱实战篇] 四.HTML+D3+CSS绘制关系图谱
  7. [Android] AlertDialog获取网上天气并显示各城市天气
  8. Python之超级好用的8个VS Code扩展
  9. 并发编程——进程——理论知识
  10. 【ARM】Tiny4412裸板编程之LED(C语言)