(CMake) 库的生成和链接

2023-05-16

文章目录

  • 前言
  • 前置准备
  • 当前项目的库
    • 静态库
    • 动态库
  • 外部项目的库
    • 静态库
    • 动态库
  • 库的总结
    • 总code
    • 函数
      • add_subdirectory() 添加源文件目录
      • add_library() 指定的源文件生成库
      • target_link_libraries() 为目标链接库
    • 关于路径
  • 安装
    • 语法
    • 完整code
      • src cmake
      • calc cmake
      • main.cpp
      • 命令行
    • 成果
  • END

前言

CMake 是一个强大的构建工具,也是C/C++程序员应该必备的技能之一

参考视频:CMake入门教程_哔哩哔哩_bilibili

找了好多教学资料不是基于linux就是跳跃性较大。偶然发现一个不错的好资源就学习了一波。

本文参考上面b站的教学视频,这个教学十分推荐,新手保姆级的,up也分享了自己的笔记和demo

本文主要记录库的生成和链接

前一篇博客:(CMake) 从下载到构建第一个CMake应用_

前置准备

在src下创建calc文件夹,并编写加法和减法两份文件

加法用户生成静态库

减法用于生成动态库

在这里插入图片描述

当前项目的库

src下的cmake

# 设置运行时目标文件(exe、dll)的输出位置
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# # 设置存档目标文件(lib、a)的输出位置
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

# 添加子目录
add_subdirectory(calc)

# (目标文件) 头文件的搜索目录
# 记得添加源文件的指定路径
target_include_directories(demo PUBLIC
                           ${PROJECT_BINARY_DIR}
                           ${PROJECT_SOURCE_DIR}/calc
                           )

静态库

calc下的cmake

# 库名 静态库 原文件
add_library(addition STATIC addition.cpp)

正常执行命令

cmake -G "MinGW Makefiles" ../src
cmake --build .

查看是否在build中有calc文件夹,其中是否有.a的静态库

注意,这是未设置静态库路径的情况下set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

在这里插入图片描述

使用

# 链接生成的静态库
target_link_libraries(demo PUBLIC addition)

设置静态库的生成路径

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

在这里插入图片描述

动态库

calc下的cmake

# 库名 动态库 原文件
add_library(subtract SHARED subtract.cpp)

src下的cmake

# 链接生成的动态库
target_link_libraries(demo PUBLIC subtract)

在这里插入图片描述

注意:运行程序的时候,要将.dll放在.exe同路径下

外部项目的库

首先我们有这些外部项目的库

  • libmultiply.a 是静态库
  • libdivision.dll 是动态库

在这里插入图片描述

# (目标文件) 头文件的搜索目录
target_include_directories(demo PUBLIC
                           ${PROJECT_BINARY_DIR}
                           ${PROJECT_SOURCE_DIR}/calc
                           ${PROJECT_SOURCE_DIR}/../other_lib
                           )

静态库

# 外部的静态库
# 使用绝对路径链接
target_link_libraries(demo PUBLIC C:/Users/windows/Desktop/demo/other_lib/libmultiply.a)

动态库

# 外部的动态库
target_link_libraries(demo PUBLIC C:/Users/windows/Desktop/demo/other_lib/libdivision.dll)

注意:运行程序的时候,还要将动态库复制一份到.exe的同目录下

库的总结

总code

main.cpp

#include <iostream>
#include "addition.h"
#include "subtract.h"
#include "multiply.h"
#include "division.h"

int main() {
    std::cout << "Hello World" << std::endl;
    std::cout << __cplusplus << std::endl;

    std::cout << "1 + 2 = " << add(1 ,2) << std::endl;
    std::cout << "3 - 1 = " << sub(3, 1) << std::endl;
    std::cout << "2 * 3 = " << mult(2, 3) << std::endl;
    std::cout << "6 / 2 = " << divide(6, 2) << std::endl;
    
    return 0;
}

CMakefiles.txt

# 设置最低本版号
cmake_minimum_required(VERSION 3.10)

# 项目名 版本 描述 主页 语言
project(demo LANGUAGES CXX VERSION 1.0 )

# 设置C++标准
set(CMAKE_CXX_STANDARD 11)
# 设置运行时目标文件(exe、dll)的输出位置
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# # 设置存档目标文件(lib、a)的输出位置
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

# 添加子目录
add_subdirectory(calc)

# 添加可执行程序
add_executable(demo main.cpp)

# 链接生成的静态库
target_link_libraries(demo PUBLIC addition)
# 链接生成的动态库
target_link_libraries(demo PUBLIC subtract)

# 外部的静态库
target_link_libraries(demo PUBLIC ${PROJECT_SOURCE_DIR}/../other_lib/libmultiply.a)

# 外部的动态库
target_link_libraries(demo PUBLIC ${PROJECT_SOURCE_DIR}/../other_lib/libdivision.dll)


# (目标文件) 头文件的搜索目录
target_include_directories(demo PUBLIC
                           ${PROJECT_BINARY_DIR}
                           ${PROJECT_SOURCE_DIR}/calc
                           ${PROJECT_SOURCE_DIR}/../other_lib
                           )

函数

add_subdirectory() 添加源文件目录

# binary_dir 指定编译结果存放的位置
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

add_library() 指定的源文件生成库

# STATIC 静态库
# SHARED 动态库
# 生成的库文件名为 lib<name>.xxx
add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [<source>...])

target_link_libraries() 为目标链接库

# item 可以是target名、绝对路径(必须保证文件存在)
target_link_libraries(<target>
                      <PRIVATE|PUBLIC|INTERFACE> <item>...
                     [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)

关于路径

虽然官方说target_link_libraries说是要指定绝对路径,但我测了相对路径也没问题

# 外部的静态库
target_link_libraries(demo PUBLIC ${PROJECT_SOURCE_DIR}/../other_lib/libmultiply.a)

# 外部的动态库
target_link_libraries(demo PUBLIC ${PROJECT_SOURCE_DIR}/../other_lib/libdivision.dll)



安装

这里说的安装其实就是类似与打包发布

这里基本就是固定的指令,就直接放代码了

语法

install(TARGETS <target> DESTINATION <dir>)
install(FILES <file> DESTINATION <dir>)
install(PROGRAMS <非目标文件的可执行程序> DESTINATION <dir>)	# 如脚本
install(DIRECTORY <dir> DESTINATION <dir>)	# 安装目录
# 安装到默认目录 CMAKE_INSTALL_PREFIX
cmake --install .
# 安装到指定目录
cmake --install . --prefix <dir>

完整code

在这里插入图片描述

src cmake

cmake_minimum_required(VERSION 3.10)

set(CMAKE_CXX_STANDARD 11)
# 动态bin 静态lib
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

project(demo VERSION 1.0 LANGUAGES CXX)

option(DATE_ENABLE "output date" ON)
if(DATE_ENABLE)
    set(DATE "2022")
endif()
# 配置文件
configure_file(config.h.in config.h)
# 子目录
add_subdirectory(calc)

add_executable(demo main.cpp)

# 本项目的内部库
target_link_libraries(demo PUBLIC addition)
target_link_libraries(demo PUBLIC subtract)
# 外部库
target_link_libraries(demo PUBLIC C:/Users/windows/Desktop/demo/other_lib/libdivision.dll)
target_link_libraries(demo PUBLIC C:/Users/windows/Desktop/demo/other_lib/libmultiply.a)

# include_directories(${PROJECT_BINARY_DIR})

target_include_directories(demo PUBLIC
                           ${PROJECT_BINARY_DIR}
                           ${PROJECT_SOURCE_DIR}/calc
                           ${PROJECT_SOURCE_DIR}/../other_lib
                           )

# 目标程序到bin
install(TARGETS demo DESTINATION bin)
# 配置到include中
install(FILES "${PROJECT_BINARY_DIR}/config.h" DESTINATION include)

# 外部库,静态到lib 动态到bin
# 头文件都到include
install(FILES "C:/Users/windows/Desktop/demo/other_lib/libmultiply.a" DESTINATION lib)
install(FILES "C:/Users/windows/Desktop/demo/other_lib/libdivision.dll" DESTINATION bin)
install(FILES "C:/Users/windows/Desktop/demo/other_lib/multiply.h" DESTINATION include)
install(FILES "C:/Users/windows/Desktop/demo/other_lib/division.h" DESTINATION include)

calc cmake

add_library(addition STATIC addition.cpp)
# 静态到lib 对于当前来说,这个静态库就是target
# 头文件到include
install(TARGETS addition DESTINATION lib)
install(FILES addition.h DESTINATION include)


add_library(subtract SHARED subtract.cpp)
# 动态到bin 对于当前来说,这个静动态库就是target
# 头文件到include
install(TARGETS subtract DESTINATION bin)
install(FILES subtract.h DESTINATION include)

main.cpp

#include <iostream>

#include "addition.h"
#include "config.h"
#include "division.h"
#include "multiply.h"
#include "subtract.h"
using namespace std;

int main() {
    cout << "Hello World" << endl;
    cout << "version " << PROJECT_VERSION_MAJOR << "." << PROJECT_VERSION_MINOR
         << endl;
#ifdef DATE
    cout << "date " << DATE << endl;
#endif

    cout << "1 + 2 = " << add(1, 2) << endl;
    cout << "3 - 1 = " << sub(3, 1) << endl;
    cout << "2 * 3 = " << mult(2, 3) << endl;
    cout << "6 / 2 = " << divide(6, 2) << endl;

    return 0;
}

命令行

# 最好先重新构建一遍
# 安装到外层目录的install中
cmake --install . --prefix ../install

成果

在这里插入图片描述

END

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

(CMake) 库的生成和链接 的相关文章

随机推荐

  • AutoTCG——移动app测试用例自动生成平台

    AutoTCG简介 1 AutoTCG 是一款在线自动化测试用例设计平台 xff0c 通过在线创建可视化测试模型 xff0c 自动生成测试用例 2 AutoTCG采用先进的数学算法 xff0c 可实现全面科学的测试覆盖 3 AutoTCG适
  • AutoTCG——桌面应用软件测试用例自动生成工具

    AutoTCG简介 1 AutoTCG 是一款在线自动化测试用例设计平台 xff0c 通过在线创建可视化测试模型 xff0c 自动生成测试用例 2 AutoTCG采用先进的数学算法 xff0c 可实现全面科学的测试覆盖 3 AutoTCG适
  • 某型车载导航软件测试

    1 设备组成 ETst USB系统主要由硬件部分与软件部分组成 硬件部分包括1553B板卡 RS232 422 485板卡 CAN总线板卡 AD采集板卡 DA转换板卡 DI DO板卡等 所有硬件板卡均采用USB的接口形式 xff0c 从而灵
  • 武器装备自动测试(ATE)系统设计要点

    1 设备组成 ETest RT系统主要由硬件部分与软件部分组成 硬件部分由上位机和实时下位机组成 xff0c 上位机采用商用便携计算机 xff0c 下位机采用PXI测控计算机 上位机安装Windows操作系统 xff0c 运行设备资源管理
  • 导弹制导控制系统半实物仿真系统的设计与实现

    设备组成 Etest CPS系统主要由硬件部分与软件部分组成 硬件部分由PCI机箱 PCI控制器以及各种PCI接口板卡组成 软件部分由测试设计软件模块 测试执行服务软件模块 测试执行客户端软件模块 设备资源管理软件模块等主要软件模块以及曲线
  • 软件功能三方测试报告

    凯云软件测评中心隶属于凯云联创 xff08 北京 xff09 科技有限公司 xff08 简称 xff1a 凯云科技 xff09 测评中心于2016年成立 xff0c 2018年1月通过中国合格评定国家认可委员会CNAS和国防科技工业实验室认
  • 兵器软件通用测试开发工具

  • 兵器软件通用测试开发方法-ETest_DEV

  • 兵器软件通用测试开发环境-ETest_DEV

  • WPS添加下划线,文字尾部不显示下划线问题解决(一个So stupid问题)

    记录一个傻瓜操作 嗯 更想删WPS了 一 问题如下 首先如图 选择wps中的下划线操作 理想中他应该是这样的 选中的内容应该在下划线中间 是吧 默认正常操作就应该这样 实际上它出来的效果是这样 文字后面选中的下划线消失了 软件自身的设置就没
  • 【记录】MPU6050原理快速入门(附手册)

    目录 MPU6050 MPU6050主要参数 MPU6050通信接口 MPU6050电路 向MPU6050的一个寄存器写一个字节的数据 从MPU6050的一个寄存器读一个字节的数据 MPU6050 MPU6050是一个运动处理传感器 xff
  • 【STM32】HAL库三步实现串口重定向(代码复制可用)

    目录 第一步 xff1a 添加标准输入输出头文件 第二步 xff1a 重写fputc 函数 第三步 xff1a 重写fgetc 函数 代码汇总 xff08 直接复制使用 xff09 需要直接来复制 在PC上进行C语言程序开发时 xff0c
  • c# Post请求实例

    server span class token comment 服务器 span span class token keyword using span span class token namespace System span span
  • STM32 串口通讯及实现

    目录 一 串口通讯概述1 广义的串口2 狭义的串口3 串口数据定义4 串口通讯应用 二 STM32串口工程标准库实现1 串口的初始化2 串口数据发送 3 串口的数据接收 一 串口通讯概述 1 广义的串口 广义的串口是针对并口来说的 串口是指
  • STM32串口接受和发送数据的程序(USART/UART)

    本实验中 STM32通过串口1和串口2上位机对话 xff0c STM32通过串口1在收到上位机发过来的字符串 以回车换行结束 后 xff0c 通过串口2原原本本的返回给上位机 串口 xff08 USART UART xff09 通信配置详解
  • CMakeLists.txt中第三方库编写思考

    编写ROS时经常需要自己构建第三方库或者引用别人的第三方库 xff0c 对于第三方库的调用主要有以下两种方式 xff1a 1 引用现成的第三方库 xff1a find package PCL 1 7 REQUIRED xff1a 添加依赖
  • vscode运行卡顿解决方案

    卡顿原因 主要是rg exe扩展程序占用CPU过高 xff0c 那么只需要禁用它即可 解决方案 打开 vs code xff0c 文件 gt 首选项 gt 设置 gt 搜索 search followSymlinks 取消勾选即可
  • 优象光流模块助力无人机之使用效果分享

    优象光流模块助力无人机之使用效果分享 我是一名无人机爱好者 xff0c 一直以来对无人机就有一种慕名的喜好 xff0c 只要有时间就会与队友们在实验室研究探讨 当然 xff0c 刚开始玩无人机悬停时会遇到种种问题 xff0c 例如飞机一开始
  • 如何使用光流芯片U30实现四轴无人机悬停

    如何使用光流芯片U30实现四轴无人机悬停 在没有GPS的环境下 xff0c 比如室内环境 xff0c 四轴无人机在水平方向会不断漂移 如何让无人机实现稳定的自主悬停呢 xff1f 光流芯片可以感知无人机在水平方向的运动信息 xff08 速度
  • (CMake) 库的生成和链接

    文章目录 前言前置准备当前项目的库静态库动态库 外部项目的库静态库动态库 库的总结总code函数add subdirectory 添加源文件目录add library 指定的源文件生成库target link libraries 为目标链接