在之前我们介绍的内容里,关于构建动态库还是静态库都是在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