windows平台下使用cmake构建静态lib库以及使用静态lib库&gtest项目

2023-05-16

有些时候我们需要将部分代码编译成单独的一个库,然后在另一个项目中去使用这个库

大部分是linux环境下的指令,但是也差不是很多

记录一下构建的经过

 

目录

1.使用cmake构建及使用lib库

构建lib库

使用lib库 

2.被测项目编译成库文件,结合gtest框架在测试项目中调用函数并输出


1.使用cmake构建及使用lib库

构建lib库

  • 最终目录展示

  • 下面给出libhello目录下的源代码

头文件hello.h

#ifndef HELLO_H
#define HELLO_H
void hello();
#endif

源文件hello.cpp

#include<stdio.h>
#include"hello.h"

void hello()
{
      printf("hello world!\n");
}

cmakelists.txt

cmake_minimum_required (VERSION 2.6)
project(hello)

#//生成动态库(SHARED)
add_library(hello  ${PROJECT_SOURCE_DIR}/libhello/hello.cpp)
#add_library(hello SHARED ${PROJECT_SOURCE_DIR}/libhello/hello.cpp)

#//安装文件到目录下
#install(TARGETS hello RUNTIME DESTINATION ${PROJECT_SOURCE_DIR}/lib)
#install(FILES "${PROJECT_SOURCE_DIR}/libhello/hello.h" DESTINATION "${PROJECT_SOURCE_DIR}/include")

注释掉的那一行是动态库,因为我后面引入动态库有点问题,所以就引入的是静态库

 

如果不知道怎么生成编译项目,见下面这个链接 

https://blog.csdn.net/yysave/article/details/96434908 

编译生成后,在debug目录下 

dll是动态库,lib是静态库,后面使用的时候我用的是静态库

理论上使用动态库就可以,占内存也小。lib是编译时用到的,dll是运行时用到的。下面这篇文章是windows下dll与lib的区别

https://www.cnblogs.com/alantu2018/p/8470976.html

 我两个库都生成保存了

使用lib库 

先给出最后的目录图(因为我怕中间某个链接找不到出问题,所以把ilk pdb文件都拷过来了)

首先先说lib文件夹,里面放的是

 

然后是cmakelists.txt

 

cmake_minimum_required (VERSION 2.6)
project(usehellolib)

# 需包含的库文件
link_directories(
   D:/Test-my/gtest/demo5/Use_lib/lib
)
#//生成可执行文件
add_executable(usehellolib usehellolib.cpp)

#//链接库到可执行文件
target_link_libraries(usehellolib hello)

然后是hello.h,和前面生成lib中的一模一样,为什么需要这个头文件呢,因为在后面的cpp文件中要使用到头文件,因为库里面是函数的实现,函数的定义还在头文件中(网上是这么说的)

 usehellolib.cpp

# include <iostream>
#include "hello.h"
int main()
{
  hello();
  system("PAUSE");
  return 0;
}

 生成项目,编译之后,在debug目录下会有执行文件

 

 点击运行就可以了。至此,我们实现了在一个项目中编译成库文件,在另一个项目中调用库文件中的函数并输出的功能

 

2.被测项目编译成库文件,结合gtest框架在测试项目中调用函数并输出

首先,不是很清楚gtest项目的先看前面我写过的两篇文章

gtest单元测试配置+vs 2015+OpenCppCoverage输出测试覆盖率 || cmake命令构建项目以及编译以及命令行测试

Cmakelists配置多级目录的gtest项目(项目代码和测试代码分离)

  •  首先,新建一个项目,将原先libhello文件夹中的内容换成下面这两个文件,代码见上面链接中

生成项目,编译,同样得到lib库(适当改写cmakelists.txt,就是改改cpp名字)

标题

 

 将库文件拷到下面目录中

 适当改写

 因为cmakelists.txt改动比较大,所以给出修改后版本

cmake_minimum_required (VERSION 3.6)

include_directories(D:/Test-my/gtest/demo5-2/Use_lib/googletest-release-1.7.0/googletest-release-1.7.0/include)
project(gtestusemyAddlib)

# 需包含的库文件
link_directories(
   D:/Test-my/gtest/demo5-2/Use_lib/lib
D:/Test-my/gtest/demo5-2/Use_lib/googletest-release-1.7.0/googletest-release-1.7.0/lib
)

ADD_SUBDIRECTORY(D:/Test-my/gtest/demo5-2/Use_lib/googletest-release-1.7.0/googletest-release-1.7.0)
find_package(Threads)
#//生成可执行文件
add_executable(gtestusemyAddlib test_calc.cpp)

#//链接库到可执行文件
TARGET_LINK_LIBRARIES(gtestusemyAddlib gtest gtest_main)
TARGET_LINK_LIBRARIES(gtestusemyAddlib hello)

#这个必须放在project的后面
IF(MSVC)
   message("run here")
   set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
   set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
endif()

经常出现的问题是,静态动态不匹配的问题,那么就需要将if(msvc)这一块加到每一个cmake文件中

注意,是每一个,也就是说,前面编译的lib就需要重新编译

否则不能用,各种报错

还有一个经常出现的问题,比如gtest/gtest.h找不到,那就是说你没有加入add_subdirectory这个指令 

最后执行结果

 

至此,就可以将此项目作为一个单纯的gtest项目

将被测代码编译成lib库文件,只用将库文件lib和头文件.h引入,就可以实现对代码函数的调用 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows平台下使用cmake构建静态lib库以及使用静态lib库&gtest项目 的相关文章

  • Eigen介绍及简单使用

    Eigen是可以用来进行线性代数 矩阵 向量操作等运算的C 43 43 库 xff0c 它里面包含了很多算法 它的License是MPL2 它支持多平台 Eigen采用源码的方式提供给用户使用 xff0c 在使用时只需要包含Eigen的头文
  • APM最新固件(20181220)

    ardupilot Makefile MAKEFILE LISTWAF BINARY 61 modules waf waf lightWAF 61 python WAF BINARY WAF FLAGSEXPLICIT COMMANDS 6
  • Java考试复习

    java考试复习 1 判断题 单选题 填空题看网上测试 xff1b 注意 xff01 xff01 xff01 xff08 单选题答案里面的粗黑的有分号是代表同时满足 xff1b 填空题答案里面的粗黑的有分号是代表其中一个就满足 xff09
  • 计算机网络之第4章 网络层

    计算机网络 第4章 网络层 网络层概述 以下属于网络层范畴的是 IP地址在因特网使用的TCP IP协议栈中 xff0c 核心协议是 IP 网络层提供的两种服务 TCP IP参考模型的网络层提供的是 无连接不可靠的数据报服务 IPv4地址概述
  • 中标麒麟Linux服务器5.0(mips64el)安装QT开发环境

    中标麒麟服务器5 0 xff08 mips64el xff09 上QT开发需要用到can口 xff0c 原版自带的QT不包含相关模块 xff0c 故重新下载一个带有can模块的qt版本进行安装 该系统架构是mips64el的 xff0c 所
  • mavros永远连接失败

    之前在做无人机使用px4源码避障的实物实验 xff0c 已经有了无人机 xff0c 想按照惯例先在nvidia NX上位机上跑一下仿真实验测试一下 xff0c 结果mavros用了一万种方法 xff0c 就是连不上 xff0c 仿真跑不了
  • 成功解决mingw下载太慢的问题

    MinGW w64 for 32 and 64 bit Windows Browse Files at SourceForge net 1 在此页面下滑找到你要下载的文件 2 点击Problems Downloadings 3 选择一个合适
  • PyQt5学习笔记9_使用setStyle和setStyleSheet进行换肤

    通过QStyleFactory keys 可获取用于setStyle的有效值 xff0c 本例程中包含 Windows xff0c WindowsXP xff0c WindowsVista xff0c Fusion 四种风格 xff0c 此
  • mkdir 创建目录

    参数选项 参数说明 p 连续创建目录 mkdir data 创建目录data 或 cd mkdir data 或 cd mkdir data 注 xff1a 是将两条命令分隔开 mkdir p data b c 连续创建目录 data b
  • CC, TBD, EOD都是什么鬼?拯救一写英文邮件就发慌

    职场新人在工作中经常听到这样的对话 xff1a 给客户的邮件记得CC我 xff0c BCC给财务 xff0c 告诉客户合同签订时间还TBD But CC BCC TBD到底是什么鬼 xff1f 马上来恶补一下职场英文缩写 xff0c 拯救一
  • Apache Openmeetings安装介绍

    翻译自Apache OpenMeetings 更新时间 xff1a 2017 01 11 目录 目录Openmeetings安装端口NAT设置自定义硬件需求Debian链接更新日志VoIP提示和技巧 Openmeetings安装 从过往版本
  • Could not transfer artifact xxx from/to xxx解决方案

    在做Openmeetings二次开发的时候install时出现了如下错误 INFO Parent project loaded span class hljs keyword from span repository org apache
  • MavenInvocationException解决方案

    在编译Openmeetings的时候出现了这样的错误信息 xff1a MavenInvocationException Error configuring command line Reason Maven executable not f
  • 生成生命周期介绍

    翻译自http maven apache org guides introduction introduction to the lifecycle html 目录 目录生成生命周期基础 生成生命周期由阶段组成通用命令行调用一个生成阶段是由
  • Crypto++库在VS 2013中的使用 + 基于操作模式AES加密

    一 下载Crypto 43 43 Library Crypto 43 43 Library的官方网 xff1a http www cryptopp com 二 建立自己使用的Crypto 43 43 Library 由于从官方网下载的Cry
  • MATLAB工具箱路径缓存

    关于MATLAB工具箱路径缓存 出于性能考虑 xff0c MATLAB将跨会话缓存工具箱文件夹信息 缓存特性对您来说是透明的 但是 xff0c 如果MATLAB没有找到您的最新版本的MATLAB代码文件 xff0c 或者如果您收到有关工具箱
  • MySQL语法

    初识MySQL 为什么学习数据库 1 岗位技能需求 2 现在的世界 得数据者得天下 3 存储数据的方法 4 程序 网站中 大量数据如何长久保存 5 数据库是几乎软件体系中最核心的一个存在 什么是数据库 数据库 DataBase 简称DB 概
  • HBase Configuration过程

    HBase客户端API中 xff0c 我们看到对HBase的任何操作都需要首先创建HBaseConfiguration类的实例 为HBaseConfiguration类继承自Configuration类 xff0c 而Configurati
  • 中国版的 Github:gitee.com、coding.net

    https gitee com 码云 社区版 主要功能代码托管 xff1a 对个人开发者提供免费的云端 Git 仓库 xff0c 可创建最多 1000 个项目 xff0c 不限公有或私有 xff0c 支持SSH HTTP SVN xff1b
  • winScp 连接 FilEZillA报(由于目标计算机积极拒绝,无法连接)

    场景 xff1a 服务器一台 xff1b 本地台式机一台 xff0c 为了文件传输方便 xff0c 在服务器上使用FilEZillA搭建了FTP xff0c 在本地使用WinScp进行连接 问题 xff1a 首先FTP搭建没问题 xff0c

随机推荐

  • 关于 Raspberry Pi3 使用 Intel® RealSense™ D400 cameras的简单介绍

    Raspberry Pi Raspberry pi 可以称为个人微型电脑 xff0c 虽然它的性能无法与普通电脑相比 xff0c 但是它在很多方面都给我们带来了惊喜 xff0c 它的特点是便于携带 xff0c 功能基本和普通电脑一样 xff
  • 安装好后 实例启动出现问题

    错误如上正在排错中 File 34 usr lib python2 7 site packages nova conductor manager py 34 line 671 in build instances request spec
  • gazebo仿真之plugin系列一

    官网教程 xff1a http gazebosim org tutorials tut 61 plugins hello world amp cat 61 write plugin 本次内容涉及五个方面 xff1a plugin的基本介绍与
  • gazebo官网教程之快速开始

    英文教程 xff1a http gazebosim org tutorials tut 61 quick start amp cat 61 get started 一 运行gazebo 打开有默认环境的gazebo只需要三步 xff1a 1
  • 基于unity无人机3D仿真《一》

    基于unity无人机3D仿真 一 实现无人机的模型的制作 运动学关系 姿态角等 xff1b 实现无人机各种姿态运动 一 目前的效果 二 无人机模型 制作软件 xff1a maya 模型结构 xff1a 三 开发平台 unity2017 43
  • 比特、字节转换

    1bite xff08 比特 xff09 61 1字节 数字 xff1a 1字符 61 1字节 英文 xff1a 1字符 61 1字节 汉字 xff1a 1字符 61 2字节 在ASCII码中 xff0c 一个英文字母 xff08 不分大小
  • Unity无人机仿真github项目

    本人本科生有幸得到导师的指导 xff0c 对Unity这个平台学习已有一段时间 该平台在搭建自主仿真平台方面确实有很大优势 下面是在学习过程中收集到的一些多旋翼无人机仿真的github项目 xff0c 可供需要的快速学习 xff08 推荐先
  • matlab2020a中使用TrueTime工具

    环境 xff1a matlab版本 xff1a 2020a 参考文章 网络控制系统仿真 xff1a Truetime2 0工具箱安装 xff08 win10 43 matlab R2017b xff09 目标 xff1a 在matlab20
  • ros的init机制续篇

    这篇博客主要探讨init的实现过程 ros span class token double colon punctuation span span class token function init span span class toke
  • 基于Unity构建机器人的数字孪生平台系列1—介绍

    1 0 简介 本系列博客将开源近两年结合Unity和多旋翼无人机的相关工作 xff0c 涵盖仿真 建模 全局云端通信网络 本地局部通信网络 ROS 43 Unity VR等方面内容 该工作完整构建以虚控实 xff0c 沉浸式VR交互 xff
  • 基于Unity构建机器人的数字孪生平台系列2—四旋翼无人机三维模型

    系列2的主要内容是探讨如何自己构建一个模型并且导入Unity 1 简介 3D仿真与其他类型仿真的一大区别是三维场景和三维模型 为了实现对某个对象的仿真 xff0c 模型是必须的 当然 xff0c 针对不同的仿真任务 xff0c 需要描述对象
  • 模式识别实现之人脸识别(matlab)

    描述 用有监督学习机制设计并实现模式识别方法 xff0c 用于进行人脸面部特征识别 xff0c 如性别 xff08 男性 女性 xff09 年龄 xff08 儿童 青少年 成年 老年 xff09 佩戴眼镜 xff08 是 否 xff09 戴
  • 无人机自动驾驶GAAS学习一

    building GAAS environment 基本依赖项 pip install pandas jinja2 pyserial cerberus pyulog numpy toml pyquaternion Q1 程序 pip 尚未安
  • 无人机学习之launch文件的学习

    官网教程 xff1a http wiki ros org roslaunch XML xff08 1 xff09 ros系统launch文件出现的原因 xff1a 一个功能的实现包括比较多的节点的运行 xff0c 并且每个节点的启动是有顺序
  • 配置最基础的linux系统——Centos6.x版本

    自然是用到虚拟机了 xff0c Vmware是我常用的 xff0c 这里建立一个虚拟的裸机很简单 xff0c 有两点是要说明的 1 最大磁盘大小 xff0c 这个默认的是最小大小 xff0c 不能设的别它还小了 xff0c 否则启动不了Ce
  • matlab实现画散点图(一个x对应多个y)

    1 具体实现是 xff0c 首选导入数据 aray 61 importdata 位置 xff1b m n 61 size array 2 x轴间距设置 x 61 1 1 m 3 处理数组数据 figure 1 for i 61 1 1 n
  • VINS-Mono源码分析7— pose_graph2(四自由度位姿图优化)

    VINS Mono源码分析7 pose graph2 在上一篇博文中 xff0c 大概分析了一下VINS Mono回环检测和重定位的代码实现 xff0c 这里主要分析 四自由度的位姿图优化 关于这部分的原理可以参考VINS Mono论文第8
  • VINS-Mono中的DBoW2关键代码注释

    VINS Mono中的DBoW2关键代码注释 在阅读VINS Mono源码时对DBoW2中代码顺手做的注释 xff0c 怕以后会忘记 xff0c 在这里记录一下 xff0c 注释有不当之处 xff0c 望各位大神看到后多多指点 理论参考高翔
  • VINS-Mono运行记录(单目+IMU)

    VINS Mono运行记录 1 VINS Mono在数据集下运行自己做的其它测试 2 单目 43 IMU自己采集数据运行记录自己做的其它测试 1 VINS Mono在数据集下运行 选取的数据集是EuRoC下的MH 05 difficult
  • windows平台下使用cmake构建静态lib库以及使用静态lib库&gtest项目

    有些时候我们需要将部分代码编译成单独的一个库 xff0c 然后在另一个项目中去使用这个库 大部分是linux环境下的指令 xff0c 但是也差不是很多 记录一下构建的经过 目录 1 使用cmake构建及使用lib库 构建lib库 使用lib