CMake基础教程(25)add_library生成库

Posted 奇妙之二进制

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMake基础教程(25)add_library生成库相关的知识,希望对你有一定的参考价值。

有时我们只需要编译出动态库,静态库,然后等着让其它程序去使用。这种情况下我们需要使用add_library函数。

生成普通库

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [source1] [source2] [...])
  • <name>
    
    • 表示库文件的名字,该库文件会根据命令里列出的源文件来创建。
    • < name>对应于逻辑目标名称,并且在项目中必须是全局唯一的。
    • 构建的库的实际文件名是基于本机平台的约定(如lib< name>.a或< name>.lib)构建的。
  • [STATIC | SHARED | MODULE]
    

    指定要创建的库的类型

    • SHARED:
      • 动态库。动态库是动态链接并在运行时加载的
      • 如果库不导出任何符号,则不能将其声明为SHARED库
    • STATIC:静态库。静态库是在链接其他目标时使用的目标文件存档
    • MODULE:
      • 模块库是没有链接到其他目标的插件,但可以在运行时使用类似dlopen的功能动态加载
      • 在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。
  • EXCLUDE_FROM_ALL:这个库不会被默认构建(排除到默认目标all之外),除非有其他的组件依赖或者手工构建。

  • [source1] [source2] [...]:指定生成库的源文件

实践

编写代码

项目结构如下:

/*
** testFunc.c
*/

#include <stdio.h>
#include "testFunc.h"

void func(int data)

	printf("data is %d\\n", data);


/*
** testFunc.h
*/

#ifndef _TEST_FUNC_H_
#define _TEST_FUNC_H_

void func(int data);

#endif

最外层的CMakeLists.txt内容如下:

cmake_minimum_required (VERSION 2.8)

project (demo)

#向当前工程添加存放源文件的子目录
add_subdirectory (lib_testFunc)

lib_testFunc目录下的CMakeLists.txt如下:

aux_source_directory (. SRC_LIST)

# 使用$SRC_LIST为原材料生成一个叫做testFunc_shared 的动态库
add_library (testFunc_shared SHARED $SRC_LIST)
# 使用$SRC_LIST为原材料生成一个叫做testFunc_static 的静态库
add_library (testFunc_static STATIC $SRC_LIST)

# 将testFunc_shared 重新命名为 libtestFunc.so
set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")
# 将testFunc_static  重新命名为 libtestFunc.a
set_target_properties (testFunc_static PROPERTIES OUTPUT_NAME "testFunc")

# 设置 库文件的默认输出路径
set (LIBRARY_OUTPUT_PATH $PROJECT_SOURCE_DIR/lib)

命令:

  • add_library: 生成动态库或静态库(第1个参数指定库的名字;第2个参数决定是动态还是静态,如果没有就默认静态;第3个参数指定生成库的源文件)
  • set_target_properties: 设置输出的名称,还有其它功能,如设置库的版本号等等。

预定义变量:

  • LIBRARY_OUTPUT_PATH: 库文件的默认输出路径,这里设置为工程目录下的lib目录

编译

现在,让我们进入build目录下运行cmake …,成功后再运行make:

cd到lib目录下进行查看,发现已经成功生成了动态库和静态库,

ps:可以看出前面使用set_target_properties重新定义了库的输出名字,如果不用set_target_properties也可以,那么库的名字就是add_library里定义的名字,只是我们连续2次使用add_library指定库名字时,这个名字不能相同,而set_target_properties可以把名字设置为相同,只是最终生成的库文件后缀不同,这样相对来说会好看点。

总结

命令总结:

命令说明示例
add_library生成动态库或静态库add_library (testFunc_shared SHARED $SRC_LIST)
set_target_properties设置输出的名称set_target_properties (testFunc_shared PROPERTIES OUTPUT_NAME "testFunc")

预定义变量总结:

预定义变量说明
LIBRARY_OUTPUT_PATH库文件的默认输出路径

库路径的位置不设置的话,默认放在BINARY_DIR下,即构建时执行cmake命令的目录下。

以上是关于CMake基础教程(25)add_library生成库的主要内容,如果未能解决你的问题,请参考以下文章

CMake基础教程(30)CMake构建系统概览

CMake基础教程(32)文件搜索指令FILE

CMake基础教程(31)add_dependencies添加target之间的依赖

CMake中add_library的使用

[cmake][转载]add_library详解

add_library 在 CMake 中不能用于添加 CSharp 源文件?