CMake 生成静态库与动态库的方法步骤

下面我来详细讲解一下“CMake 生成静态库与动态库的方法步骤”的完整攻略。

1. 理解静态库与动态库

首先,我们需要理解静态库与动态库的概念。

静态库和动态库都是用于存储二进制代码的文件,其中静态库在编译期间被链接到可执行文件,而动态库则在运行时被动态链接到可执行文件。

在使用CMake构建项目时,可以通过添加不同的参数来指定生成静态库或动态库。

2. 生成静态库

生成静态库需要进行以下步骤:

  1. 编写代码文件

首先,我们需要编写要放入静态库的代码,在这里我以一个简单的示例程序为例,假设我们需要编写一个计算两个数之和的函数,在头文件add.h中定义如下:

int add(int a, int b);

在源文件add.cpp中实现如下:

#include "add.h"

int add(int a, int b) {
    return a + b;
}
  1. 编写CMakeLists.txt文件

在根目录下新建一个CMakeLists.txt文件,编写如下内容:

cmake_minimum_required(VERSION 3.0)

# 定义项目名称和语言类型
project(MyMathLibrary CXX)

# 添加头文件路径
include_directories(include)

# 添加源文件路径
set(SRC_ADD src/add.cpp)

# 添加静态库
add_library(MathLibrary STATIC ${SRC_ADD})

这里的add_library命令用于生成静态库,${SRC_ADD}即为要编译成静态库的源文件路径。

  1. 运行CMake生成Makefile文件

在终端中,我们输入以下命令:

$ mkdir build && cd build
$ cmake ..

这里的..指向CMakeLists.txt文件所在的目录。

CMake将会在build目录生成Makefile文件。

  1. 使用Makefile文件编译

运行以下命令:

$ make

这将会编译生成一个名为libMathLibrary.a的静态库文件,在build目录下。

3. 生成动态库

生成动态库与生成静态库类似,需要进行以下步骤:

  1. 编写代码文件

继续以计算两个数之和的函数为例,头文件add.h中定义如下:

int add(int a, int b);

在源文件add.cpp中实现如下:

#include "add.h"

__attribute__((visibility("default"))) int add(int a, int b) {
    return a + b;
}

其中__attribute__((visibility("default")))是为了保证函数的可见性,在动态库中需要使用该属性。

  1. 编写CMakeLists.txt文件

在根目录下新建一个CMakeLists.txt文件,编写如下内容:

cmake_minimum_required(VERSION 3.0)

# 定义项目名称和语言类型
project(MyMathLibrary CXX)

# 添加头文件路径
include_directories(include)

# 添加源文件路径
set(SRC_ADD src/add.cpp)

# 添加动态库
add_library(MathLibrary SHARED ${SRC_ADD})

# 设置动态库版本号
set_target_properties(MathLibrary PROPERTIES VERSION 1.0 SOVERSION 1)

这里的add_library命令用于生成动态库,${SRC_ADD}即为要编译成动态库的源文件路径。另外,通过set_target_properties命令可以设置动态库的版本号,方便管理。

  1. 运行CMake生成Makefile文件

在终端中,我们输入以下命令:

$ mkdir build && cd build
$ cmake ..

这里的..指向CMakeLists.txt文件所在的目录。

CMake将会在build目录生成Makefile文件。

  1. 使用Makefile文件编译

运行以下命令:

$ make

这将会编译生成一个名为libMathLibrary.so的动态库文件,在build目录下。

4. 示例

下面提供另一个生成动态库的示例,在这个示例中,我们使用CMake构建一个简单的插件程序。

  1. 编写代码文件

首先,我们需要编写插件的代码,假设我们需要编写一个实现加法的插件,在头文件add.h中定义如下:

int compute(int a, int b);

在源文件add.cpp中实现如下:

#include "add.h"

__attribute__((visibility("default"))) int compute(int a, int b) {
    return a + b;
}
  1. 编写CMakeLists.txt文件

在根目录下新建一个CMakeLists.txt文件,编写如下内容:

cmake_minimum_required(VERSION 3.0)

# 定义项目名称和语言类型
project(MyPlugin CXX)

# 添加头文件路径
include_directories(include)

# 添加插件源文件路径
set(PLUGIN_SRC src/plugin.cpp)

# 添加插件目标文件路径
add_library(my_plugin SHARED ${PLUGIN_SRC})

# 添加目标文件依赖
target_link_libraries(my_plugin MathLibrary)

# 设置插件输出目录
set_target_properties(my_plugin PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/plugins)

# 复制依赖库文件到插件输出目录
add_custom_command(TARGET my_plugin POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:MathLibrary> ${CMAKE_SOURCE_DIR}/plugins)

这里的add_library命令用于生成插件,${PLUGIN_SRC}即为要编译成插件的源文件路径。另外,通过设置LIBRARY_OUTPUT_DIRECTORY,可以指定插件的输出目录。

  1. 运行CMake生成Makefile文件

在终端中,我们输入以下命令:

$ mkdir build && cd build
$ cmake ..

这里的..指向CMakeLists.txt文件所在的目录。

CMake将会在build目录生成Makefile文件。

  1. 使用Makefile文件编译

运行以下命令:

$ make

这将会编译生成一个名为libmy_plugin.so的插件文件,在plugins目录下。同时,已经将MathLibrary库文件复制到了plugins目录,以便插件运行时可以正确链接到依赖库。

以上就是CMake 生成静态库与动态库的完整攻略,希望可以帮助到你。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:CMake 生成静态库与动态库的方法步骤 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • Windows7更新补丁KB4022719下载地址 (附KB4022719补丁修复更新内容) 32位/64位

    Windows 7 更新补丁 KB4022719 下载地址 (附 KB4022719 补丁修复更新内容) 32 位/64 位攻略 1. 简介 Windows 7 更新补丁 KB4022719 是微软发布的一个重要安全补丁,用于修复系统中的漏洞和提升系统的稳定性。本攻略将详细介绍如何下载和安装该补丁,并提供一些示例说明。 2. 下载地址 你可以从微软官方网站下…

    other 2023年7月28日
    00
  • 详解Spring Boot加载properties和yml配置文件

    关于“详解Spring Boot加载properties和yml配置文件”的攻略,我将分为以下几个部分进行详细讲解: Spring Boot的默认配置文件名与位置 properties文件的加载方式 yml文件的加载方式 示例1:properties文件和yml文件混合使用 示例2:指定profile加载不同的配置文件 接下来我将一一进行展开说明。 1. S…

    other 2023年6月25日
    00
  • Golang开发gRPC服务入门介绍

    Golang开发gRPC服务入门介绍 什么是gRPC? gRPC是一种高性能、开源和通用的RPC框架,由Google推出,基于ProtoBuf序列化协议来实现,具有简单易用、跨语言、高效快速等特点。 gRPC工作原理是什么? gRPC基于HTTP/2协议,利用protobuf进行序列化,传输效率极高,具体实现原理请参考官方文档 gRPC的优点 性能高:采用p…

    other 2023年6月27日
    00
  • 最新版jsoncpp的下载、编译、及使用

    最新版jsoncpp的下载、编译、及使用攻略 JSONCPP是一个流行的C++库,用于解析和生成JSON数据。本攻略将介绍如何下载、编译使用最新版的JSONCPP提供两个示例。 下载JSONCPP JSONCPP的最版本可以从其GitHub存储库中下载。以下下载JSONCPP的步骤: 打开JSONCPP的GitHub存储库:https://github.co…

    other 2023年5月9日
    00
  • JS中封装axios来管控api的2种方式

    在JS中,使用axios作为网络请求库是非常常见的。在实际应用中,我们需要封装axios来管理API,以便于维护和升级。这里介绍两种常见的封装axios的方式。 方式一:基于axios.create()方法 通过axios.create()方法创建一个新的axios实例,然后在这个实例中设置一些统一的请求头、请求拦截器和响应拦截器等。示例代码如下: impo…

    other 2023年6月25日
    00
  • Windows Server 2008 R2上部署Exchange Server 2010图文教程

    关于部署Exchange Server 2010的图文教程,我们可以分为以下步骤来进行: 1. 安装必要的软件 进行Exchange Server 2010部署前,需要先安装Windows Server 2008 R2操作系统。此外,还需要安装以下软件: .NET Framework 3.5.1 Windows Management Framework Co…

    other 2023年6月27日
    00
  • 电脑开机无图标 显示svchost.exe应用程序错误该怎么办?

    如果电脑开机后没有出现图标,而且出现了 svchost.exe 应用程序错误的提示,应该按照以下步骤进行排查和处理: 检查症状 首先要确认电脑确实出现了“电脑开机无图标 显示svchost.exe应用程序错误”的症状,可以观察电脑开机的过程中屏幕上是否出现了错误提示框,以及是否能够进入系统界面。 检查硬件 如果电脑的硬件出现了问题,可能导致出现该症状。可以检…

    other 2023年6月25日
    00
  • jquery-dialog(弹出窗口 遮蔽窗口)

    jquery-dialog(弹出窗口 遮蔽窗口) jQuery是一个流行的JavaScript框架,提供了一系列易于使用的UI组件,其中包括弹出窗口。jQuery弹出窗口不仅易于使用,而且具有高度可定制性,可以使您的网站或应用程序看起来更专业和现代化。 弹出窗口的基本语法 要使用jQuery弹出窗口,您需要引入jQuery库和相关的jQueryUI库。然后,…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部