CMake基础(4)动态库

简介: CMake基础(4)动态库

0x01 介绍

CMake来构建动态库(也称为共享库)。要构建动态库,您需要在CMakeLists.txt中使用CMake的add_library命令,并指定库的类型为SHARED。

学习cmake, 理解了前3节内容 后面都比较简单。

要使用CMake创建动态库,您需要完成以下步骤:

  1. 创建一个名为CMakeLists.txt的文件,并将其放在库的根目录中。
  2. 使用cmake_minimum_required命令指定CMake的最低版本要求。
  3. 使用project命令指定库的名称。使用set命令设置生成文件的输出目录。
  4. 使用include_directories命令指定需要包含的文件夹。
  5. 使用add_library命令添加库的源代码文件。指定库的类型为SHARED。
  6. 下面是一个示例CMakeLists.txt文件,它用于创建一个名为hello_library的动态库

要使用CMake创建可执行文件链接动态库,需要在以上基础上完成以下步骤:

  1. 使用add_executable添加可执行文件代码
  2. 使用target_link_libraries链接静态库hello_library

0x02 示例

下面是一个简单的demo,使用 CMake 构建一个共享/动态库:

本教程中的文件如下:

ln28@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_04$ tree
.
├── CMakeLists.txt
├── build
├── include
│   └── shared
│       └── Hello.h
└── src
    ├── Hello.cpp
    └── main.cpp
 
4 directories, 4 files

[CMakeLists.txt] - 包含要运行的 CMake 命令

# 指定CMake的最低版本要求。
cmake_minimum_required(VERSION 3.1)
 
# 使用project命令指定库的名称
project(hello_library)
 
# 使用add_library命令添加库的源代码文件。指定库的类型为SHARED
add_library(hello_library SHARED src/Hello.cpp)
 
# 添加别名,允许你在将目标链接到其他目标时使用别名引用该目标
add_library(hello::library ALIAS hello_library)
 
 
# 添加头文件目录
target_include_directories(hello_library PUBLIC ${PROJECT_SOURCE_DIR}/include)
 
 
# 使用add_executable添加可执行文件代码
add_executable(hello_binary src/main.cpp)
 
# 使用target_link_libraries链接静态库hello_library
target_link_libraries(hello_binary PRIVATE hello::library)

[include/shared/Hello.h] - 要包含的头文件

#ifndef __HELLO_H__
 
#define __HELLO_H__
 
 
class Hello
{
 
public:
 
void print();
 
};
 
#endif

[src/Hello.cpp] - 要编译的源文件

#include <iostream>
 
#include "shared/Hello.h"
 
void Hello::print()
{
 
    std::cout << "Hello Shared Library!" << std::endl;
 
}
 
 [src/main.cpp] - 具有 main 的源文件 
#include "shared/Hello.h"
 
int main(int argc, char *argv[])
 
{
 
    Hello hi;
 
    hi.print();
 
    return 0;
 
}

使用cmake .. && make -j24进行编译生成出 hello_binary 和 libhello_library.so, 你也可以参考

ln28@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_04/build$ cmake .. && make -j24
-- Configuring done
-- Generating done
-- Build files have been written to: /mnt/d/Project/Cmake_examples/cmake_basics_04/build
Scanning dependencies of target hello_library
[ 25%] Building CXX object CMakeFiles/hello_library.dir/src/Hello.cpp.o
[ 50%] Linking CXX shared library libhello_library.so
[ 50%] Built target hello_library
Scanning dependencies of target hello_binary
[ 75%] Building CXX object CMakeFiles/hello_binary.dir/src/main.cpp.o
[100%] Linking CXX executable hello_binary
[100%] Built target hello_binary
ln28@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_04/build$ ls
CMakeCache.txt  CMakeFiles  Makefile  cmake_install.cmake  hello_binary  libhello_library.so
ln28@DESKTOP-FS9U3GT:/mnt/d/Project/Cmake_examples/cmake_basics_04/build$ ./hello_binary
Hello Shared Library!


相关文章
|
SQL API 数据库
Seata AT模式问题之抛出异常触发回滚如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题
934 112
|
自然语言处理 算法 Java
C/C++ 程序员编程规范之注释
C/C++ 程序员编程规范之注释
706 1
|
自然语言处理
CMake基础(3)静态库
CMake基础(3)静态库
203 1
|
Java 关系型数据库 MySQL
水果商城系统 SpringBoot+Vue
这篇文章介绍了一个使用SpringBoot+Vue开发的前台和管理员端的水果商城系统,包括用户功能如登录、注册、商品浏览、购物车、订单处理等,以及管理员功能如用户管理、商品管理、新闻公告管理等。
水果商城系统 SpringBoot+Vue
|
SQL 数据挖掘 API
ibis:极具潜力的Python数据分析新框架
ibis:极具潜力的Python数据分析新框架
264 6
|
NoSQL 算法 Shell
【C/C++ 调试 GDB指南 】详解 gdb 断点的设置方式
【C/C++ 调试 GDB指南 】详解 gdb 断点的设置方式
446 2
|
存储 弹性计算 大数据
【阿里云弹性计算】阿里云ECS在大数据处理中的应用:高效存储与计算实践
【5月更文挑战第23天】阿里云ECS在大数据处理中发挥关键作用,提供多样化实例规格适应不同需求,尤其大数据型实例适合离线计算。通过集成分布式文件系统如OSS,实现大规模存储,而本地存储优化提升I/O性能。弹性扩容和计算优化实例确保高效运行,案例显示使用ECS能提升处理速度并降低成本。结合阿里云服务,ECS构建起强大的数据处理生态,推动企业创新和数字化转型。
323 0
|
编译器 C语言 C++
CMake基础(9)使用Clang编译
CMake基础(9)使用Clang编译
1218 0
|
数据采集 人工智能 自然语言处理
我们要对齐什么——从对齐任务类型与对齐目标明确数据收集准则
在Modelscope活动中,主办方欲通过模型盲测收集并整理一批人类反馈数据。本次我在数据的收集过程之外,根据问答与模型的输出,结合论文From Instructions to Intrinsic Human Values -- A Survey of Alignment Goals for Big Models,具体探究了本次实验过程中的对齐目标。
563 0
|
JSON 并行计算 API
使用CJSON/Nlohmann:快速简便地在C/C++中处理JSON数据
使用CJSON/Nlohmann:快速简便地在C/C++中处理JSON数据
2988 0