Cmake add_library命令

  • add_library
    • 1. 普通库
      • 1.1 命令形式
      • 1.2 命令参数
      • 1.3 示例代码
    • 2. 对象库
      • 2.1 命令形式
      • 2.2 示例代码
    • 3. 接口库
      • 3.1 命令形式
    • 4. 导入的库
      • 4.1 命令形式
    • 5. 别名库
      • 5.1 命令形式

add_library

add_library命令用来使用指定的源文件向工程中添加一个目标库,主要有一下几种形式。

1. 普通库

1.1 命令形式

add_library(<name> [STATIC | SHARED | MODULE][EXCLUDE_FROM_ALL][<source>...])
  • 添加一个从source列表列出的文件构建而来的目标名为name的库。
  • name必须全局唯一
  • 构建库的源文件可以直接指定,也可以后续使用target_sources()指定
  • STATIC(静态库) SHARED(动态库) MODULE(模块库)用来指定库的类型。
    -使用STATIC构建生成静态库(name.a),使用SHARED构建生成动态库(name.so)。

1.2 命令参数

  • name:构建成的库名
  • STATIC|SHARED|MOUDLE:库的类型
  • EXCLUDE_FROM_ALL:加了EXCLUDE_FROM_ALL属性的target在默认编译的时候,不会被编译,如果要编译它们,需要手动编译
  • source:构建库的文件

1.3 示例代码

add_library(hello_library STATICsrc/Hello.cpp
)

2. 对象库

2.1 命令形式

add_library(<name> OBJECT [<source>...])

这种形式类型固定为OBJECT,以这种方式,只编译source列表的文件,但不将生成的目标文件打包或者链接为库,而是在其他add_library()或者add_executable()生成目标的时候,可以使用形如$<TARGET_OBJECTS:objlib>的表达式将对象库作为源引入。

2.2 示例代码

使用方式:

add_library(<objlib> OBJECT [<source>...])
add_library(... $<TARGET_OBJECTS:objlib> ...)
add_executable(... $<TARGET_OBJECTS:objlib> ...)

具体示例:

add_library(test_library OBJECT a.cpp b.cpp c.cpp)
add_executable(test_app main.cpp $<TARGET_OBJECTS:my_library>)
add_library(anotherlib STATIC other.cpp $<TARGET_OBJECTS:my_library>)

test_library并没有被实际生成,使用test_library的目标文件的
生成表达式作为 参数放在add_library或者add_executable放源
代码的位置,而不能放在target_link_library的位置。

这种方式不常使用,因为静态库就是把文件打包,这种情况直接使用静态库就行,了解即可。

3. 接口库

3.1 命令形式

add_library(<name> INTERFACE [IMPORTED [GLOBAL]])

生成一个接口库,这类库不编译任何文件,也不在磁盘上产生库文件。它有一些属性被设置,并且能够被安装和导出。通常,使用以下命令在接口目标上填充属性。

- set_property()
- target_link_library(INTERFACE)
- target_link_options(INTERFACE)
- target_include_directions(INTERFACE)
- target_compile_options(INTERFACE)
- target_compile_definitions(INTERFACE)
- target_sources(INTERFACE)

然后像其他目标一样被用作参数给target_link_libraries()

4. 导入的库

4.1 命令形式

add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED[GLOBAL])
  • 用来导入已经存在的库,CMake也不会添加任何编译规则给它。
  • 此类库的标志就是有IMPORT属性,导入的库的作用域为创建它的目录及更下级目录。但是如果有GLOBE属性,则作用域被拓展到全工程。
  • 导入的库的类型必须是STATIC, SHARED, MODULE, UNKNOWN中的一种
    对于UNKNOW类型,不需要知道类型就可使用的
    从工程外部引入一个库,使用IMPORTED_LOCATION属性确定库文件的在磁盘上的完整路径。

5. 别名库

5.1 命令形式

add_library(<name> ALIAS <target>)

为给定library添加一个别名,后续可使用<name>来替代<target>

Cmake-add_library()相关推荐

  1. 【CMake】Android Studio 中使用 CMake 编译单个 C++ 源文件 ( 常用的 CMake 命令解析 )

    文章目录 一.Android Studio 中使用 CMake 编译单个 C++ 源文件 二.cmake_minimum_required 命令设置最小 CMake 版本 三.project 命令设置 ...

  2. Cmake-Cookbook学习笔记

    Cmake学习笔记 Cmake-Cookbook 1.cmake中相关路径 2.cmake常用变量.函数.语法 2.1 add_custom_command.add_custom_target 2.2 ...

  3. cmake:add_library生成静态库和动态库

    此文为:轻松入门cmake系列教程 有时我们只需要编译出动态库,静态库,然后等着让其它程序去使用.让我们看下这种情况该如何使用cmake 实验 实验一:生成静态库 编写代码 项目结构如下: [CMak ...

  4. cmake学习笔记之add_library、target_link_libraries和link_directories

    cmake是Linux(这里默认是Ubuntu系统)下常使用的编译C++的工具,而使用cmake就需要先在CmakeLists.txt文件中对编译规则进行.这里介绍常用的三种指令add_library ...

  5. cmake之 ADD_LIBRARY()

    上一篇我分析了如何调用别人的第三方库,现在我继续分析如何构建一个库供他人使用.完成这个任务需要用到ADD_LIBRARY() 1:ADD_LIBRARY()语法 add_library(<nam ...

  6. ++项目 cmake头文件路径_CMAKE入门实战

    0.导语 最近做的项目使用CLION构建,而这个采用CMakeLists.txt管理,因此为了更好的学习,故找到了一篇大牛级别的入门文章,有文章有代码,本文是花了一点时间把这篇文章学习后的重要点记录吧 ...

  7. cmake java_JNI系列之AS支持CMake了

    写在前面 Android Studio 2.2+已支持CMake编译,与以前NDK-Build方式相比方便了不少,本文旨在引导大家在AS2.2+下一步一步建立JNI工程进行开发,并假设大家已经对JNI ...

  8. 在Ubuntu18.04下的Cmake使用记录

    (1)首先是安装cmake.命令如下: sudo apt-get install cmake (2)创建一个源程序,1.cpp如下:(1.cpp的位置是位于hoem/ysh/code) #includ ...

  9. CMake结合PCL库学习(2)

    紧接着上一篇文章 对于PCL 库中的各个模块之间是有相互依赖关系的 其中Common模块是最基础的模块,其中是定义各种数据结构的头文件,所以Common这个模块是不需要依赖性响的,但是IO 模块就是需 ...

最新文章

  1. Java基础系列——IO流
  2. HDU4055 - number string(DP)
  3. APP技巧:微信中这6个设置建议关闭,可以防止个人信息或将全暴露,赶快看一看吧!...
  4. 团队Alpha冲刺(三)
  5. swing获取文本框内容_营销管理培训课件,大客服销售策略和技巧,全内容PPT拿来就用...
  6. python链表值讲解_python数据结构之链表的实例讲解
  7. rk修改launcher_RK launcher V 0.41 官方版
  8. docker“少折腾”
  9. Virtual Earth 添加纽约3D地图
  10. 图像处理-形态学运算
  11. 正则系列之手机号码正则
  12. win10edge启用html5,win10系统下edge浏览器怎么启用和禁用flash
  13. mac nginx php-fpm,Mac OS nginx 502 解决记录(php-fpm 启动失败)
  14. 什么时候真正体会到了,磨刀不误砍柴工?
  15. 类人机器人AI系统进阶模型 - 试论计算机模拟意识
  16. AI产业快速落地难?破局人来了
  17. 在日签证更新手续 网址
  18. maven 打包打出带依赖的和不带依赖的jiar包
  19. flutter友盟分享_Flutter中使用友盟统计
  20. 在vue3中使用jsx语法

热门文章

  1. keil内存溢出表现_详细讲解C语言五大内存分区与可执行程序的三段(Text段、Date段、Bss段)【建议收藏】...
  2. vue 进入首页只弹一个弹框_vue.js实现只弹一次弹框
  3. css按钮大小固定,在CSS中创建一个固定宽度的按钮
  4. android ascii 比较大小写,为什么可以通过ASCII中的字母排序规则来进行字母的大小写转换?...
  5. python整数逆位运算_Python这些位运算的妙用,绝对让你大开眼界
  6. C++ 11互斥锁的应用(针对于多线程的情况)
  7. Fedora CoreOS to CentOS7 问题汇总1
  8. LaTex在Linux下编写高质量的文档
  9. 一周文章导读:架构图;服务器;CPU
  10. OpenMP变量的私有与共享