首页 > 其他分享 >【CMake系列】05-静态库与动态库编译

【CMake系列】05-静态库与动态库编译

时间:2024-06-12 13:48:08浏览次数:21  
标签:CMake log 05 cpp --- 编译 build test cmake

在各种项目类型中,可能我们的项目就是一个 库 项目,向其他人提供 我们开发好的 库 (windows下的 dll /lib ; linux下的 .a / .so);有时候在一个项目中,我们对部分功能 打包成 库,方便在不同地方进行调用

静态库 和 动态库 对项目 实现了 不同程度的解耦,

  • 静态库,往往会 链接时 加载,代码会复制一起打包到 可执行程序中
  • 动态库 更多是 运行时 加载,加载到内存,供可执行程序调用

学会使用 cmake 构建 静态库 和 动态库,是我们这篇文章的主要内容

本专栏的实践代码全部放在 github 上,欢迎 star !!!

如有问题,欢迎留言、或加群【392784757】交流

涉及命令

add_library(<name> [<type>] [EXCLUDE_FROM_ALL] <sources>...)

其中 type 用来指定构建库的类型【本篇 只针对 shared static 展开】
type

  • shared
  • static
  • ...

使用库

# 路径配置相关 有时候需要
include_directories()
link_directories()

target_link_libraries() # 关键代码 

代码部分

log/
|---|---|log.cpp
|---|---|log.h
|---|---|CMakeLists.txt
test_log/
|---|---|test_log.cpp
|---|---|CMakeLists.txt
CMakeLists.txt

log.h

// log.h
#ifndef LOG_H
#define LOG_H


class Log
{
public:
  Log();
};
#endif

log.cpp

#include "log.h"
#include <iostream>
using namespace std;

Log::Log()
{
  cout << "create Log" << endl;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)

project(log)

add_library(log STATIC log.cpp log.h)

test_log 下

test_log.cpp

#include <iostream>
#include "log.h"
using namespace std;

int main()
{
  Log log;
  cout << "test log" << endl;
  return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.20)

project(test_log)

include_directories("../log") # 头文件路径

# 指定库查找路径 windows 自动找 ../log/build/Debug ../log/build/Release
link_directories("../log/build")

add_executable(test_log test_log.cpp)

#指定加载的库
target_link_libraries(test_log log)

构建静态库

type 指定的是 static

cd log
cmake -B build -S .
cmake --build build

cd test_log
cmake -B build -S .
cmake --build build

具体的还可以指定 lib的输出路径

动态库构建

我们 在 log 同级目录下 创建 CMakeLists.txt 内容如下

cmake_minimum_required(VERSION 3.20)

project(log)

include_directories(log)

# 添加log库编译 项目自带预处理变量 log_EXPORTS
add_library(log SHARED log/log.cpp)

add_executable(test_log test_log/test_log.cpp log)


target_link_libraries(test_log log)

windows下构建动态库存在问题

如果我们把 STATIC 改为 SHARED ,然后构建,发现会报错

LINK : fatal error LNK1104: 无法打开文件“Debug\log.lib”

其实 也就是 找不到.lib 文件

log.h 修改

// log.h
#ifndef LOG_H
#define LOG_H

// __declspec(dllexport) 导出 log 到lib文件中

#ifndef _WIN32
#define CPP_API
#else
// 针对 windows 平台
// log 库文件调用 dllexport
// test_log 调用 dllimport
// 通过预定义宏 确定是谁在调用
#ifdef log_EXPORTS
#define CPP_API __declspec(dllexport) // 库项目调用
#else
#define CPP_API __declspec(dllimport) // 调用库项目 调用
#endif
#endif

class CPP_API Log
{
public:
  Log();
};
#endif

需要将 dll 中定义的 函数、类符号 等导出到lib 才能找到 【也就是 符号导出】

  • dll 二进制代码
  • lib 函数 符号 地址 【理解程度有限】

做法就是在 函数、类等 前面 添加 _declspec(dllexport),

关于 dllexport dllimport 的更详细解释,推荐这个
https://zhuanlan.zhihu.com/p/680966160

然后进行构建,成功!
在这里插入图片描述
在这里插入图片描述

标签:CMake,log,05,cpp,---,编译,build,test,cmake
From: https://www.cnblogs.com/caibucai/p/18243776

相关文章

  • 【CMake系列】03-cmake 注释、常用指令 message、set、file、for_each、流程控制if
    本文给出了cmake中的一些常用的指令,可以快速了解,为后面的内容深入打点基础。本专栏的详细实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392784757】交流注释#行注释#[[多行注释]]message(""#[[这里也可以注释]]"")message在学习时......
  • 【CMake系列】01-CMake是什么
    在很多开源项目中,经常可以看到CMakeLists.txt这一文件,依靠它才能完成项目的配置运行过程。那它是什么?接下来,在这个专栏中,我们将系统学习CMake这一个重要工具。本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392784757】交流CMake是什么CMake......
  • 【CMake系列】11-CMake Pack
    cmakepack用于将我们的写好的项目打包,发送给使用方;打包后产生的内容有源代码包二进制包平台原生的二进制安装Debian->.debredhat->.rpmmacOS->.dmgwindows->NSIS本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、......
  • 【CMake系列】10-cmake测试集成googletest与第三方库自动化构建
    cmake测试,使用ctest可能不能满足我们的需求,需要我们使用更为强大的第三方测试框架,如googletest,完成项目中的测试工作本篇文章将第三方测试框架googletest,引入,同时也可以作为关于第三方包自动化构建的很好示例,值得学习本专栏的实践代码全部放在github上,欢迎star!!!如......
  • 【CMake系列】10-cmake测试 ctest
    cmake作为一个强大的构建系统指导工具,同时也提供了测试功能,可用于项目的单元测试等,也可以与其他测试框架协作,如googletest,共同完成项目开发中的测试工作,本节我们就来学习如何借助cmake完成测试本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392......
  • 【CMake系列】09-cmake install 一般文件 文件夹 代码文件
    上一节,我们学习了项目构建后、目标的安装,本节学习的内容是对于一般文件,文件夹以及源代码的安装本节的文件依然使用file(WRITExxx.xx)来创建,不依赖额外的文件本专栏的实践代码全部放在github上,欢迎star!!!如有问题,欢迎留言、或加群【392784757】交流文件安装CMakeLi......
  • C语言详解(编译和链接)
    Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎~~......
  • CSCI-UA.0480-051: Parallel Computing
    CSCI-UA.0480-051:ParallelComputingFinalExam(May 15th,2023)Total:100 pointsProblem 1Supposewehavethe followingtwo DAGs. Each DAG represents a process. That is, DAG 1 is a process and DAG 2 is another process. The two DAG......
  • gcc编译时报错 fatal error: stdio.h: 没有那个文件或目录
    在kylinV10中使用GCC编译代码时遇到如下问题:首先确认了,自己单词没有拼写错。然后再检查GCC的版本,确实没问题。没有标准的头文件需要安装build-essential来解决。需要安装build-essential。执行以下命令:sudoapt-getinstallbuild-essential如无兼容版本可使用可使用ap......
  • 【PB案例学习笔记】-05 图片浏览器
    写在前面这是PB案例学习笔记系列文章的第5篇,该系列文章适合具有一定PB基础的读者。通过一个个由浅入深的编程实战案例学习,提高编程技巧,以保证小伙伴们能应付公司的各种开发需求。文章中设计到的源码,小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.gi......