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 中了。

posted @   narjaja  阅读(8868)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示