CMake:编译静态库和动态库
创始人
2024-04-24 14:52:01
0

一个程序通常会按照功能需求,进行一定的划分,拆分成不同的子功能,子功能一般会被编译成库,每个库可能包含多个源文件和头文件,并且由不同的人同时进行开发。

可以使用add_library完成静态库和动态的编译:

程序文件结构如下:

├── build
├── CMakeLists.txt
├── install
├── lib_o
│   ├── CMakeLists.txt
│   ├── lib_o.c
│   └── lib_o.h
├── lib_so
│   ├── CMakeLists.txt
│   ├── lib_so.c
│   └── lib_so.h
└── m.c

其中lib_o会被编译为静态库:

//lib_o.h
void call_lib_o();
//lib_o.c
#include 
#include "lib_o.h"void call_lib_o()
{printf("this is call_lib_o\n");
}

#CMakeLists.txt in lib_o

#aux_source_directory将当前目录下的所有源文件名字放入变量O_SRCS

aux_source_directory(. O_SRCS)

#add_library指令用于编译库,STATIC表示是静态库
add_library(lib_o STATIC ${O_SRCS})

#target_include_directories用于设置库所依赖的头文件路径
target_include_directories(lib_o PUBLIC .)

 lib_so会被编译为动态库:

//lib_so.h
void call_lib_so();
//lib_so.c
#include 
#include "lib_so.h"void call_lib_so()
{printf("this is call_lib_so\n");
}

#CMakeLists.txt in lib_so

#aux_source_directory将当前目录下的所有源文件名字放入变量O_SRCS

aux_source_directory(. SO_SRCS)

#add_library指令用于编译库,STATIC表示是动态库
add_library(lib_so SHARED ${SO_SRCS})

#target_include_directories用于设置库所依赖的头文件路径
target_include_directories(lib_so PUBLIC ${CMAKE_SOURCE_DIR}/lib_so)

#INSTALL用于设定动态库的安装路径

#其中变量INSTALL_DIR由顶层CMakeLists.txt定义并传递下来
INSTALL(TARGETS lib_so DESTINATION ${INSTALL_DIR})

 主程序需要调用两个库中提供的函数:

//m.c
#include 
#include "lib_o.h"
#include "lib_so.h"int main()
{call_lib_o();call_lib_so();return 0;}

#CMakeLists.txt in 工程的顶层目录

cmake_minimum_required(VERSION 3.15.0 FATAL_ERROR)

project(call_lib)

#设置INSTALL_DIR变量为安装目录
set(INSTALL_DIR ${CMAKE_SOURCE_DIR}/install)

#将lib_o及lib_so目录加入到工程中,即执行其中的CMakeLists.txt
add_subdirectory(lib_o)
add_subdirectory(lib_so)

add_executable(call_lib m.c)

#设置依赖的库
target_link_libraries(call_lib PRIVATE lib_o)
target_link_libraries(call_lib PRIVATE lib_so)

INSTALL(TARGETS call_lib DESTINATION ${INSTALL_DIR})

 编译完成后,可执行文件和动态库文件将位于install目录:

install
│   ├── call_lib
│   └── liblib_so.so

直接执行call_lib可能会报错,需要通过LD_LIBRARY_PATH指定动态库的运行路径,可以参照:

GCC:头文件和库文件的路径_风静如云的博客-CSDN博客_gcc 头文件路径

相关内容

热门资讯

手机系统安卓和ios系统下载地... 你有没有发现,现在手机的世界里,安卓和iOS两大系统就像是一对双胞胎,各有各的特色,让人爱不释手。今...
安卓系统最早开发公司,从安卓起... 你有没有想过,我们每天离不开的安卓系统,它究竟是由哪家公司最早开发的呢?没错,就是谷歌(Google...
安卓系统平板推荐学生用,学生适... 作为一名热爱学习的学生,你是不是也在寻找一款既实用又好用的平板电脑呢?平板电脑在学习和生活中可是个得...
安卓5.0系统多大容量,存储容... 你有没有想过,你的安卓手机里那个神秘的安卓5.0系统到底有多大容量呢?别急,今天就来给你揭秘这个谜团...
芒果嗨是安卓系统吗,揭秘这款热... 你有没有听说过“芒果嗨”这个名字?最近,这个名词在手机圈里可是火得一塌糊涂。不过,别急,今天咱们就来...
安卓系统锁屏如何破,破解攻略全... 你是不是也遇到了安卓手机锁屏的烦恼?每次解锁都要输入复杂的密码或者滑动图案,有时候真是急得团团转。别...
安卓系统app开机自启,深度解... 你有没有发现,每次手机开机,那些APP就像一群调皮的小精灵,迫不及待地跳出来和你打招呼?没错,说的就...
安卓系统拨号连接在哪,拨号连接... 你是不是也和我一样,有时候在使用安卓手机时,突然想连接一下网络,却发现不知道怎么操作?别急,今天就来...
安卓系统为什么会赢,技术革新与... 你有没有想过,为什么安卓系统在智能手机市场上如此火爆,几乎成了“手机必备”的存在呢?今天,就让我带你...
电脑可以做安卓系统么,电脑上运... 你有没有想过,电脑能不能装上安卓系统呢?这听起来是不是有点像科幻电影里的情节?别急,让我带你一探究竟...
国产安卓系统碎片化软件,软件生... 你有没有发现,现在手机上的安卓系统越来越丰富多样了?没错,这就是我们今天要聊的话题——国产安卓系统的...
安卓系统的蚂蚁花呗,蚂蚁花呗在... 你知道吗?在安卓系统的世界里,有一个超级方便的支付工具,那就是蚂蚁花呗。它就像你的贴心小助手,让你在...
安卓2系统彩蛋在哪找,揭秘隐藏... 你有没有发现,安卓2系统里竟然隐藏着一些神秘的彩蛋?没错,就是那些让你忍不住想要一探究竟的小惊喜。今...
全球最大的安卓系统,全球最大移... 你知道吗?在智能手机的世界里,有一个系统可是当之无愧的“王者”——那就是安卓系统!它就像一位全能的魔...
安卓系统就没有碎片了,迈向无缝... 你知道吗?最近在科技圈里,安卓系统可是掀起了一阵不小的波澜呢!有人说,安卓系统再也没有碎片化了?这可...
安卓系统平板电脑评测,安卓平板... 你有没有想过,在这个信息爆炸的时代,拥有一台性能卓越的安卓系统平板电脑,简直就是移动办公和娱乐的完美...
双系统安卓自动关机,双系统安卓... 你有没有遇到过这样的情况:手机里装了双系统安卓,一边是工作用的,一边是娱乐用的,结果有时候不小心,手...
圣地安列斯安卓9系统,圣地安列... 亲爱的读者,你是否也像我一样,对科技新动态充满好奇?今天,我要和你分享一个超级有趣的话题——圣地安列...
平果有安卓系统的吗,畅享智能生... 你有没有想过,手机的世界里,竟然还有这样一个有趣的现象?那就是——平果手机,竟然也有安卓系统!是不是...
vivoy27安卓系统下载,畅... 你有没有听说最近Vivo Y27这款手机的新鲜事儿?没错,就是它的安卓系统下载!今天,我就要给你来个...