CMake--静态库与动态库构建

Posted narjaja

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CMake--静态库与动态库构建相关的知识,希望对你有一定的参考价值。

小结内容

  • 建立一个静态库和动态库,提供 HelloFunc 函数供其他程序编程使用, HelloFunc 向终端输出Hello World 字符串。
  • 安装头文件与共享库。

1.代码与CMakeList.txt文件编写

首先建立 t3 目录,用于存放本节涉及到的工程
t3目录下创建lib目录用来存代码

在 t3 目录下建立 CMakeLists.txt ,

PROJECT(HELLOLIB)
ADD_SUBDIRECTORY(lib)
#SET(LIBRARY_OUTPUT_PATH < 路径 >) #指定库的生成位置。

在 lib 目录下建立两个源文件 hello.c 与 hello.h
hello.c 内容如下:

#include "hello.h"
void HelloFunc()
{
    printf("Hello Worldn");
}

hello.h 内容如下:

#ifndef HELLO_H
#define HELLO_H
#include <stdio.h>
void HelloFunc();
#endif

在 lib 目录下建立 CMakeLists.tx

SET(LIBHELLO_SRC hello.c)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})       #添加动态库
#ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})      #添加静态库
#ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})   
#SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")     #更改静态库输出名字
#GET_TARGET_PROPERTY(OUTPUT_VALUE hello_static OUTPUT_NAME)     #获取静态库输出名字
#MESSAGE(STATUS “This is the hello_static OUTPUT_NAME:”${OUTPUT_VALUE})
#SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)        #设置动态库版本号
#INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib) #安装静态库与动态库
#INSTALL(FILES hello.h DESTINATION include/hello) #安装头文件

2.编译动态库与静态库:

仍然采用 out-of-source 编译的方式,按照习惯,我们建立一个 build 目录,在 build 目录中

$cmake ..
$make

可以在 lib 目录得到一个 libhello.so

3.指令解析

ADD_LIBRARY

ADD_LIBRARY(libname [SHARED|STATIC|MODULE]
[EXCLUDE_FROM_ALL]
source1 source2 ... sourceN)

1)第一个参数为库的名字,不需要写全 libhello.so ,只需要填写 hello 即可, cmake 系统会自动为你生成libhello.X。
2)类型有三种 :

  • SHARED ,动态库
  • STATIC ,静态库
  • MODULE ,在使用 dyld 的系统有效,如果不支持 dyld ,则被当作 SHARED 对待。

3)EXCLUDE_FROM_ALL 参数的意思是这个库不会被默认构建,除非有其他的组件依赖或者手工构建。

SET_TARGET_PROPERTIE

SET_TARGET_PROPERTIES(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)

1)这条指令可以用来设置输出的名称,对于动态库,还可以用来指定动态库版本和 API 版本。
与他对应的指令是:

GET_TARGET_PROPERTY(VAR target property)

来获取target属性。

2)这条指令同样可以设置动态库版本号

SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
  • VERSION 指代动态库版本
  • SOVERSION 指代 API 版本

将上述指令加入 lib/CMakeLists.txt 中,重新构建看看结果。
在 build/lib 目录会生成:
libhello.so.1.2
libhello.so.1->libhello.so.1.2
libhello.so ->libhello.so.1

install

将 libhello.a, libhello.so.x 以及 hello.h 安装到系统目录,才能真正让其他人开发使用,在本例中利用上一节了解到的 INSTALL 指令,我们向 lib/CMakeLists.txt 中添加如下指令:

INSTALL(TARGETS hello hello_static
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)
INSTALL(FILES hello.h DESTINATION include/hello)

通过终端执行:

$cmake -DCMAKE_INSTALL_PREFIX=/usr ..
$make
$sudo make install

我们就可以将头文件和共享库安装到系统目录 /usr/lib 和 /usr/include/hello 中了。









以上是关于CMake--静态库与动态库构建的主要内容,如果未能解决你的问题,请参考以下文章

如何使用cmake生成基于静态库的动态链接库

当我链接动态库而不是静态库时,CMake 有效

CMake 学习四:CMake 构建静态库和动态库

从父 cmake 动态/静态库构建 cmake 静态库的最佳方法

iOS 静态库,动态库与 Framework

[Linux 高并发服务器]制作静态库与动态库