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 头文件路径

相关内容

热门资讯

我来教大家“掼蛋大师辅助器ap... 亲,掼蛋大师这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,掼蛋大师的开挂软件,名...
我来教大家“开心联盟辅助器ap... 您好,开心联盟这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“友愉棋牌辅助器ap... 您好,友愉棋牌这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打...
我来教大家“全盛棋牌辅助器ap... 亲,全盛棋牌这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,全盛棋牌的开挂软件,名...
我来教大家“情怀三三麻将辅助器... 我来教大家“情怀三三麻将辅助器app官方下载最新版本更新”详细分享开挂一、情怀三三麻将AI软件牌型概...
我来教大家“无锡好运麻将辅助器... 亲,无锡好运麻将这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,无锡好运麻将的开挂...
我来教大家“推筒子辅助器app... 您好,推筒子这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中打牌...
我来教大家“比奇堡辅助器app... 我来教大家“比奇堡辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方神...
我来教大家“新兴茶苑辅助器ap... 我来教大家“新兴茶苑辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“欢乐互动辅助器ap... 我来教大家“欢乐互动辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“东方互娱辅助器ap... 亲,东方互娱这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,东方互娱的开挂软件,名...
我来教大家“天天乐清麻将辅助器... 我来教大家“天天乐清麻将辅助器app官方下载最新版本更新”详细分享开挂一、天天乐清麻将AI软件牌型概...
我来教大家“唐三彩辅助器app... 我来教大家“唐三彩辅助器app官方下载最新版本更新”详细分享开挂一、唐三彩AI软件牌型概率发牌机制”...
我来教大家“Y0辅助器app官... 我来教大家“Y0辅助器app官方下载最新版本更新”详细分享开挂一、Y0AI软件牌型概率发牌机制”必胜...
我来教大家“天天互娱辅助器ap... 亲,天天互娱这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,天天互娱的开挂软件,名...
我来教大家“悟空竞技麻将辅助器... 亲,悟空竞技麻将这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,悟空竞技麻将的开挂...
我来教大家“情怀开化麻将辅助器... 我来教大家“情怀开化麻将辅助器app官方下载最新版本更新”详细分享开挂一、情怀开化麻将AI软件牌型概...
我来教大家“龙炎互娱辅助器ap... 我来教大家“龙炎互娱辅助器app官方下载最新版本更新”详细分享开挂一、龙炎互娱AI软件牌型概率发牌机...
我来教大家“闲逸碰胡辅助器ap... 亲,闲逸碰胡这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,闲逸碰胡的开挂软件,名...
我来教大家“友聚麻将辅助器ap... 我来教大家“友聚麻将辅助器app官方下载最新版本更新”详细分享开挂一、友聚麻将AI软件牌型概率发牌机...