首页 > 编程语言 >cmake系列-怎么在构建C++库文件时动态的选择构建动态库还是静态库

cmake系列-怎么在构建C++库文件时动态的选择构建动态库还是静态库

时间:2024-11-17 11:44:06浏览次数:3  
标签:cmake DEMO C++ 构建 demo LIBS SHARED 动态

在之前我们介绍的内容里,关于构建动态库还是静态库都是在CMakeLists.txt里指定的,那如果一个解决方案原来是构建动态库,然后因为某些原因又希望构建静态库了,那岂不是还要修改CMakeLists.txt,对于平时用的构建系统来说好像还真的是需要修改,哈哈,但是cmake确实有方案能够在不用修改CMakeLists.txt的情况下动态的选择是构建动态库还是静态库,这篇文章我们就来聊一下具体的方法。

在之前的文章里,我们都是使用为add_library()指令提供SHARED和STATIC参数的方法,来指定生成动态库和静态库,但是这个参数其实是可选的,如果不指定一般会生成静态库,另外在不指定的情况下,我们还可以在构建的时候使用一个参数来指定,这不就是动态选择构建动态库还是静态库的效果吗,是的,所以这个就是方案。

接下来我们看具体示例,示例使用安装了vs的Windows系统,使用vscode编辑器。

先看一下demo结构
在这里插入图片描述

然后看下代码

// demo_config.h

#ifndef DEMO_CONFIG_H
#define DEMO_CONFIG_H

#ifdef DEMO_EXPORT
    #define DEMO_API __declspec(dllexport)
#else
    #define DEMO_API __declspec(dllimport)
#endif

#endif
// demo.h

#ifndef DEMO_H
#define DEMO_H

#include "demo_config.h"

class Demo
{
public:
    Demo() = default;

    ~Demo() noexcept = default;

    DEMO_API void Func();
};

#endif
// demo.cpp

#include "demo.h"

#include <iostream>

void Demo::Func()
{
    std::cout << "demo" << std::endl;
}

代码很简单就不解释了,重点是CMakeLists.txt

cmake_minimum_required(VERSION 3.26)

project(demo)

option(BUILD_SHARED_LIBS "Build shared libraries" ON)

include_directories(include)

aux_source_directory(src srcfiles)

add_library(${PROJECT_NAME} ${srcfiles})

target_compile_definitions(${PROJECT_NAME} PRIVATE "DEMO_EXPORT")

这个CMakeLists.txt里出现了一些新的指令,我们来解释一下:

  • 指令option()的作用是提供一个可供选择的bool变量选项,如果这个变量已经设置为普通或者缓存变量了,则这个指令就不生效了,这里的option(BUILD_SHARED_LIBS "Build shared libraries" ON)意思就是设置一个默认值为ON(即开启,关闭是OFF)的选项BUILD_SHARED_LIBS,参数"Build shared libraries"只是对这个选项的解释。
  • 之前我们讲过使用指令add_definitions()设置预定义宏,这里的指令target_compile_definitions()同样是在设置预定于宏,只是指令target_compile_definitions()可以指定目标,并且可以指定访问范围。

这些文件完成之后,我们在demo目录下先执行命令cmake -B build生成构建系统,然后执行命令cmake --build build --config Debug构建程序目标。
在这里插入图片描述

可以看到构建出来的是动态库,因为我们将选项BUILD_SHARED_LIBS设置了默认是ON,那我们改一下执行的命令,在生成构建系统的时候将选项BUILD_SHARED_LIBS设置为OFF,要怎么做呢,我们可以在demo目录下执行命令cmake -DBUILD_SHARED_LIBS=OFF -B build生成构建系统,这样就将选项BUILD_SHARED_LIBS设置为了OFF,然后执行命令cmake --build build --config Debug构建程序目标
在这里插入图片描述

可以看到构建出来的就是静态库了。

如果这篇文章对你有帮助,别忘了关注我啊,可能我还会写出更多对你有帮助的文章

标签:cmake,DEMO,C++,构建,demo,LIBS,SHARED,动态
From: https://blog.csdn.net/2401_85919417/article/details/143828292

相关文章

  • 【C++笔记】一维数组元素处理
    目录1.插入元素方法代码2.删除元素方法代码3.交换元素方法代码1.插入元素方法概念:插入元素是指在数组的某个位置添加一个新元素,并将原来的元素向后移动。例如,将5插入到数组[1,2,4,6]的第二个位置,结果变为[1,5,2,4,6]。关键点:确定插入位置:首先要明......
  • 如何让Excel公式中的参数实现动态引用
        如果你想成为Excel函数高手,仅仅掌握VLOOKUP和Countif等函数是远远不够的,起码你得学会使用INDIRECT函数,熟练掌握INDIRECT函数能让你从一个初学者晋级为高手,学会它就好比孙悟空掌握了72般变化的基本功,你说厉不厉害。    INDIRECT函数用于将文本字符串转换为......
  • C++继承权限
    目录1.相关概念 2.继承权限private:protectedpublic:3.继承中的构造函数与析构函数4.继承同名成员的处理方式5.多继承1.相关概念  定义:允许一个类继承另外一个类的属性和方法。 好处:可以减少一些重复性的代码 语法:classA :继承权限 B     ......
  • 数据结构与算法刷题(参考代码随想录结构,C、C++实现)
    目录数组数组理论基础二分查找移除元素有序数组的平方长度最小的子数组螺旋矩阵Ⅱ总结篇链表1.链表理论基础2.移除链表元素3.设计链表4.反转链表5.两两交换链表中的节点6.删除链表的倒数第N个节点7.链表相交8.环形链表Ⅱ9.总结篇哈希表1.哈希表理论基础2.有效的字母异位词3.两个数......
  • 实验二 数码管的静态和动态显示方法、矩阵式键盘扫描
    本文主要介绍了课本第5章第3、7节数码管与矩阵式键盘接口设计的实验,本节内容更侧重对原理的理解,可能会出简答题LED数码管的显示原理静态显示当LED位于静态显示时,无论多少位LED数码管都处于同时显示的状态,但1位数码管独占1个IO口实验一#include<reg51.h>#defineucharu......
  • 动态规划-背包问题——[模版]完全背包问题
    1.题目解析题目来源[模版]完全背包_牛客题霸_牛客测试用例 2.算法原理1.状态表示与01背包相同,这里的完全背包也是需要一个二维dp表来表示最大价值,具体如下求最大价值dp[i][j]:在[1,i]区间选择物品,此时总体积不大于j时的最大价值求装满时的价值dp[i][j]:在[......
  • 构建最小生成树(Prim算法和Kruskal算法)
    其中克鲁斯卡尔算法中判断是否发生自环也可采用DFS和BFS判断,这里采用是并查集#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;#defineINF100000000;classEdge{public:intx1,x2;//边的两个顶点intw;//权Edge(intX1......
  • 【C++复习】栈-下篇
    大家好,这里是不会写开场白的Yinph。今天我们先来复习一下中缀表达式、前缀表达式和后缀表达式,以及如何用栈来实现它们之间的运算。一、中缀表达式‌‌中缀表达式‌是一种算术或逻辑公式的表示方法,其中操作符位于操作数的中间。这种表示方法符合人们的日常书写习惯,因此被广泛使......
  • 【C++】static(静态)
    类外静态变量或函数意味着,当需要将这些变量或函数与实际定义的符号链接时,链接器不会在这个翻译单元的作用域之外寻找那个符号定义,即只会在这个翻译单元内部链接(文件内可用)如果这句话并不理解,可以看一下【C++】HowtheC++CompilerWorks和【C++】HowtheC++LinkerWork......
  • node.js毕设新能源汽车动态单价推荐(程序+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容选题背景关于新能源汽车动态单价推荐的研究,现有研究主要集中在新能源汽车的成本分析、市场定价策略以及消费者行为等方面,专门针对动态单价推荐系统的研究较少。在国......