前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【CMake教程】(四)CMake 配置生成lib或者so的库文件

【CMake教程】(四)CMake 配置生成lib或者so的库文件

作者头像
CNNer
发布于 2020-07-21 05:15:34
发布于 2020-07-21 05:15:34
13.1K00
代码可运行
举报
文章被收录于专栏:CNNerCNNer
运行总次数:0
代码可运行

(1)系列教程介绍

  上面几个教程我们的程序都是生成可执行文件。但是我们在合作开发算法的时候经常需要交付的是一个模块,该模块提供特定的算法功能,用于给整体的项目进行调用。但我们又不能直接提供源码,所以我们可以提供一个库文件(静态库或者动态库),配置接口文件可以在不提供源代码的情况下给他人提供算法模块功能。本文主要讲述如何使用CMakeLists.txt,配置生成动态和静态库文件。

(2)CMake 的使用环境和安装

本教程的使用环境为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ubutu18.04 lts
gcc version 7.5.0
g++ version 7.5.0
cmake version 3.10.2

安装cmake:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt install cmake

(3)设置设置我们的程序输出为lib文件

  配置输出库文件(lib和so)主要是通过函数add_subdirectory进行配置,使用STATIC表示静态库(lib),SHARED表示动态库(so)。同时可以使用SET_TARGET_PROPERTIES函数可以设置库文件的版本。

首先,看一下整体的目录结构:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
|-- tutorial_fourth/

  |-- src/

      |-- tutorial.cpp

  |-- include/

      |--TutorialConfig.h.in

  |-- mathlib/

      |-- CMakeLists.txt

      |-- mathlib.h

      |-- mathlib.cpp

  |-- CMakeLists.txt

根目录下的CMakeLists.txt文件为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 设置cmake的最低版本
cmake_minimum_required(VERSION 3.10)

# 设置工程名称 和版本
project(tutorial VERSION 1.0)

# 设置指定的C++编译器版本是必须的,如果不设置,或者为OFF,则指定版本不可用时,会使用上一版本。
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 指定为C++11 版本
set(CMAKE_CXX_STANDARD 11)

# 提供一个选项是OFF或者ON,如果没有初始值被提供则默认使用OFF
option(USE_MYMATH "Use tutorial provided math implementation" ON)

# 指定版本号的配置文件
configure_file(include/TutorialConfig.h.in TutorialConfig.h)

# 判断变量USE_MYMATH是否设置了ON,如果设置了配置mathlib library
if(USE_MYMATH)
  # 添加一个名字为mathlib的子编译路径
  add_subdirectory(mathlib)

  # 列出mathlib库的所有项目,并添加到外部库变量EXTRA_LIBSlist(APPEND EXTRA_LIBS mathlib)

  # 将子路径"${PROJECT_SOURCE_DIR}/mathlib"添加到外部路径变量EXTRA_INCLUDESlist(APPEND EXTRA_INCLUDES "${PROJECT_SOURCE_DIR}/mathlib")
endif()

# 增加生成可执行文件,生成的程序名称为:tutorial_first
add_executable(tutorial src/tutorial.cpp)

# 对目标的外部库进行链接操作
target_link_libraries(tutorial PUBLIC ${EXTRA_LIBS})

# 为指定项目添加 include 路径
target_include_directories(tutorial PUBLIC
                        "${PROJECT_BINARY_DIR}"
                        ${EXTRA_INCLUDES}
)

mathlib路径下CMakeLists.txt文件为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 设置动态库的版本 为1.2
SET_TARGET_PROPERTIES(mathlib PROPERTIES VERSION 1.2 SOVERSION 1)

# 为库mathlib 添加源文件,该命令声明库文件
add_library(mathlib mathlib.cpp)

为了将cmake中的变量自动传递到程序中,在TutorialConfig.h.in中添加#cmakedefine USE_MYMATH命令用于在cmake中生成USE_MYMATH宏定义。 TutorialConfig.h.in中代码为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// the configured options and settings for Tutorial
#define Tutorial_VERSION_MAJOR @tutorial_second_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @tutorial_second_VERSION_MINOR@
#cmakedefine USE_MYMATH

在程序tutorial.cpp中添加处理命令:在cmake中定义USE_MYMATH的时候在程序中才会编译该命令块。具体请看CMakeDemo4代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifdef USE_MYMATH
#  include "MathFunctions.h"
#endif

命令使用:

set_target_properties:设置目标的属性值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set_target_properties(target1 target2 ...
      PROPERTIES prop1 value1
      prop2 value2 ...)

add_library: 为生成的库添加源文件,是库的名字,直接写名字即可,不要写lib,会自动加上前缀。STATIC表示静态库(lib),SHARED表示动态库(so)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            source1 [source2 ...])

option: 提供一个选项是OFF或者ON,如果没有初始值被提供则默认使用OFF。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
option(<option_variable> "help string describing option"
      [initial value])

add_subdirectory: 添加一个编译的子路径,在子路径中查找CMakeLists.txt文件,并进行编译。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
add_subdirectory(source_dir [binary_dir]
            [EXCLUDE_FROM_ALL])

list:对项目中的所有值构建一个list,然后对变量进行操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> ...]
<output variable>)
list(APPEND <list> [<element> ...])
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)

target_link_libraries:对目标进行链接操作,如果有需要链接的库文件的时候才进行操作,如果该项目没有库文件,则不需要该命令。该命令一般在add_executable后面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
target_link_libraries(<target> ... <item>... ...)

(4)使用CMake进行编译

CMake在生成文件的过程中会生成很多中间缓存文件,为了使项目更简洁,文件路径更清楚,一般会在项目的root目录下建立一个文件夹,用于存储CMake生成的中间文件。而一般使用的文件家名称为build或者release。下面是使用命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 进入项目的root目录,本文为:tutorial_first
cd tutorial_first

# 创建存储缓存文件的文件夹,build
mkdir build

# 使用CMake命令生成makefile文件
cmake ..

# 使用make命令进行编译
cmake --build .
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNNer 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
CE(CHEAT ENGINE)修改器新手入门教程
Cheat Engine 一般简称CE,是一个开放源代码的作弊软件,其功能包括:内存扫描、十六进制编辑器、调试工具。
Khan安全团队
2024/08/29
1.5K0
CE(CHEAT ENGINE)修改器新手入门教程
CE修改器使用教程 [入门篇]
Cheat Engine 一般简称为CE,它是一款开放源代码的作弊软件,其主要功能包括、内存扫描、十六进制编辑器、动态调试功能于一体,且该工具自身附带了安全工具,可以用它很方便的生成自己的脚本,CE可以说是目前最优秀的游戏修改器不是之一,这款修改工具绝对值得你去学习,只需要花一点点时间就够了。
王瑞MVP
2022/12/28
16.1K0
CE修改器使用教程 [入门篇]
CE修改器使用教程 [基础篇]
Cheat Engine 一般简称CE,是一个开放源代码的游戏修改软件,其功能包括,内存扫描、十六进制编辑器、调试工具,Cheat Engine 自身附带了辅助制作工具,可以用它直接生成窗体工具,CE可以说是目前最优秀的修改器不是之一,这个工具绝对值得你去学习,只要花一点时间就够了。
王瑞MVP
2022/12/28
3.8K0
CE修改器使用教程 [基础篇]
2.4 CE修改器:代码替换功能
代码替换功能,需要使用 Cheat Engine 工具的“代码查找”功能,来查找游戏数据存储在内存中的地址。首先找到当前数值的存储地址,并将其添加到下方地址列表中。然后右键单击该地址,并选择“找出是什么改写了这个地址”,将弹出一个空白窗口。接着,点击本教程窗口上的“改变数值”按钮,并返回 Cheat Engine,如果操作没有问题,在空白窗口中将出现一些汇编代码。选中代码并点击“替换”按钮,将其替换为什么也不做的代码(空指令),同时,修改后的代码也将放置在“高级选项”的代码列表中保存。点击“停止”,游戏将以正常方式继续运行,关闭窗口。现在,再次点击教程窗口上的“改变数值”,如果锁定速度足够快,“下一步”按钮将变为可点击状态。提示:在锁定地址时,如果速度足够快,“下一步”按钮也会变为可点击状态。
王瑞MVP
2023/11/13
6820
2.4 CE修改器:代码替换功能
Cheat Engine 小白教程(大白话教学)上篇
cheat engine是一款电脑游戏修改器(简称:CE修改器),我这个人话不多不跟别的博主一样说一堆没用的!
刘鸿运
2022/11/22
5.1K0
Cheat Engine 小白教程(大白话教学)上篇
ce修改器怎么用 ce修改器使用基础教程[通俗易懂]
这篇文章是教大家CE修改器的使用方法,教程简单易学,有需要的小伙伴就赶紧和小编一起来学习一下吧。
全栈程序员站长
2022/11/17
2.4K1
【Windows 逆向】CheatEngine 工具 ( CheatEngine 简介 | 使用 Lazarus 编译 CE 源码 | CheatEngine 相关文档资料 )
CheatEngine 简称 CE , 这是一款 内存 修改 编辑工具 , 借助该工具 , 可以修改运行在 Windows / Mac 系统上的 游戏 或 软件 的内存数据 ;
韩曙亮
2023/03/29
1.5K0
【Windows 逆向】CheatEngine 工具 ( CheatEngine 简介 | 使用 Lazarus 编译 CE 源码 | CheatEngine 相关文档资料 )
2.7 CE修改器:多级指针查找
在本步骤中,你需要使用多级指针的概念来查找健康值真正的地址并修改它。多级指针就是一个指针的指针,也就是第一个指针指向第二个指针,第二个指针指向第三个指针,以此类推,最终指向你想要访问的地址。
王瑞MVP
2023/11/13
6890
2.7 CE修改器:多级指针查找
CE修改器入门:精确数值扫描
附加Tutorial-i386.exe进程后,我们点击教程的下一步按钮,接着继续第二关,第二关的作用还是很简单的,主要目的是遍历出我们想要的动态数据,比如角色的生命,人物的魔法等,都会用到精确扫描,可以说这一关是既简单又实用的东西,也是今后制作中最常用的环节,接着我们看下Tutorial-i386.exe程序对这一关通关流程的描述:
王瑞MVP
2023/02/25
1K0
CE修改器入门:精确数值扫描
2.5 CE修改器:寻找数值指针
上一步阐述了如何使用代码替换功能对付变化位置的数据地址,但这种方法往往不能达到预期的效果,所以我们需要学习如何利用指针,在本关的Tutorial.exe窗口下面有两个按钮,一个会改变数值,另一个不但能改变数值而且还会改变数值在内存中存储的位置。接下来我们将找到内存中的基址,为什么要找指针,在前面的教程中,如果各位细心观察的话就会发现 在笔者截图中的出现地址和你的地址并不相同。也就是说,这些地址是一直在变化的,我们把它叫做动态地址,我们必须寻找到该动态地址的基址,并以此来保证唯一性。
王瑞MVP
2023/11/13
1.2K0
2.5 CE修改器:寻找数值指针
【Windows 逆向】CheatEngine 工具 ( 汉化版 CE 工具推荐 | 编写简单 C++ 程序 | C++ 程序执行分析 | 使用 CE 修改上述 C++ 程序 )
推荐一个汉化版的 CE 工具 : https://bbs.pediy.com/thread-195729-1.htm
韩曙亮
2023/03/29
2.2K0
【Windows 逆向】CheatEngine 工具 ( 汉化版 CE 工具推荐 | 编写简单 C++ 程序 | C++ 程序执行分析 | 使用 CE 修改上述 C++ 程序 )
2.8 CE修改器:寻找共享代码
本关我们将学习共享代码,在C语言中角色属性都是以结构体的方式进行存储的,而结构体所存储的信息都是连续性的,这一关我们将会解释如何处理游戏中的共用代码,这种代码是通用在除了自己以外的其他同类型对像上的常常你在修改游戏的时候,你找到了一个单位的健康值或是你自己角色的生命值,你会发现一种情况,如果你把生命值相关代码移除的话,其结果是你的角色无敌,但你的敌人也无敌了,这就是共享代码的问题。
王瑞MVP
2023/11/13
4280
2.8 CE修改器:寻找共享代码
1.1 熟悉x64dbg调试器
x64dbg 是一款开源、免费、功能强大的动态反汇编调试器,它能够在Windows平台上进行应用程序的反汇编、调试和分析工作。与传统的调试器如Ollydbg相比,x64dbg调试器的出现填补了Ollydbg等传统调试器的不足,为反汇编调试工作提供了更高效、更可靠的解决方案。正是因为有了这些优点,才能使其成为当今最受欢迎的反汇编调试软件之一。
王瑞MVP
2023/07/06
6980
1.1 熟悉x64dbg调试器
PC 端微信技术研究之保存聊天语言
最近又学习了某位大佬用 CE 的方法,大佬的一句话有点醍醐灌顶,然后有了新的感觉,然后开始尝试实践这篇文章。
信安之路
2019/03/04
1.6K0
PC 端微信技术研究之保存聊天语言
2.1 CE修改器:精确数值扫描
本关是CE修改器的第一关,用户需要通过 Cheat Engine 工具完成精确扫描值。在这个练习中,需要将一个特定的数值(健康值)改变为 1000。首先,要确保数值类型设置正确,默认的是2字节或4字节。接着,选择“精确数值”扫描类型,将健康值填入数值输入框中,点击“首次扫描”。在扫描结果中,如果出现多个地址,可以继续点击打我按钮并输入变更后的健康值来进行“再次扫描”,确定正确的地址。双击左侧列表中的地址可以将其移动到下方的地址列表中并显示其当前值。接着,双击下方地址列表中的数值(或者选择它,按下回车),填写你要修改的数值1000。如果操作正确,"下一步"按钮将变成可点击的状态,本关就算完成了。如果出现错误,可以点击“新的扫描”重新开始扫描,或者点击“打我”查找更多的线索。
王瑞MVP
2023/11/12
8640
2.1 CE修改器:精确数值扫描
CE修改器入门:运用代码注入
从本关开始,各位会初步接触到CE的反汇编功能,这也是CE最强大的功能之一。在第6关的时候我们说到指针的找法,用基址定位动态地址。但这一关不用指针也可以进行修改,即使对方是动态地址,且功能更加强大。
王瑞MVP
2023/02/25
1.8K0
CE修改器入门:运用代码注入
7.7 实现进程内存读写
内存进程读写可以让我们访问其他进程的内存空间并读取或修改其中的数据。这种技术通常用于各种调试工具、进程监控工具和反作弊系统等场景。在Windows系统中,内存进程读写可以通过一些API函数来实现,如OpenProcess、ReadProcessMemory和WriteProcessMemory等。这些函数提供了一种通用的方式来访问其他进程的内存,并且可以用来读取或写入不同类型的数据,例如整数、字节集、浮点数等。
王瑞MVP
2023/09/25
5540
7.7 实现进程内存读写
[系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向
您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列。因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全、逆向分析和恶意代码检测,“系统安全”系列文章会更加聚焦,更加系统,更加深入,也是作者的慢慢成长史。换专业确实挺难的,逆向分析也是块硬骨头,但我也试试,看看自己未来四年究竟能将它学到什么程度,漫漫长征路,偏向虎山行。享受过程,一起加油~
Eastmount
2021/02/09
3.3K0
2.6 CE修改器:代码注入功能
从本关开始,各位会初步接触到CE的反汇编功能,这也是CE最强大的功能之一。在第6关的时候我们说到指针的找法,用基址定位动态地址。但这一关不用指针也可以进行修改,即使对方是动态地址,且功能更加强大。代码注入是将一小段你写出的代码注入到目标进程中并执行它的技巧。在这一步教程中,你将有一个健康值和一个每按一次将减少 1 点健康值的按钮,你的任务是利用"代码注入",使每按一次按钮增加2点的健康值。
王瑞MVP
2023/11/13
9270
2.6 CE修改器:代码注入功能
2.2 CE修改器:未知数值扫描
本关需要扫描未知数只扫描,要在不知道初始值的情况下找到一个在0到500之间的数值。首先,选择“未知的初始值”扫描方式,在数值类型中选择 4 字节,并点击“首次扫描”以开始扫描。扫描结束后,点击“打我”按钮进行一些操作,回到 Cheat Engine,选择“减少的数值”作为扫描类型,点击“再次扫描”并重复操作直到检索出很少的几个地址。由于该数值在0到500之间,可以挑出最为相似地址,并将其加入到下方的地址列表。接着,将健康值更改为 5000 以便进入下一关。需要记住的重点是,在开始新的扫描之前,务必要先点击“新的扫描”按钮。
王瑞MVP
2023/11/12
6860
2.2 CE修改器:未知数值扫描
推荐阅读
相关推荐
CE(CHEAT ENGINE)修改器新手入门教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档