首页 > 系统相关 >windows--cmake与c++的使用教程(15)

windows--cmake与c++的使用教程(15)

时间:2022-12-21 08:34:10浏览次数:70  
标签:cmake lib windows config c++ edv root oct

windows--cmake与c++的使用教程(15)

1 概述

本节目标:target_link_libraries 为项目链接动态库

2 target_link_libraries 作用

  • 常用于链接给定目标或者使用的库。(说人话:链接第三方库, 静态库与动态库)

比如,项目A需要依赖动态库B,那么, 动态库B通常需要提供:头文件、lib库文件和可执行程序dll文件。头文件用于告知动态库中的接口,lib(符号表)文件用于通过编译项目,dll文件用于程序运行时。

3 准备

  • 库文件的config.cmake文件: 用于指定动态库的头文件、lib库文件和dll文件

5 顺序

  • 使用 find_package 找到对应的库, 再调用 target_link_libraries 将库连接到目标中。
  • find_package 怎么知道去哪里寻找对应的 XX-config.cmake文件呢? 答案就是CMAKE_PREFIX_PATH 变量,将 XX-config.cmake文件所在路径设置到CMAKE_PREFIX_PATH变量中,即可。 且须放在 find_package 调用之前。 也就是说, 先设置CMAKE_PREFIX_PATH,再调用find_package, 最后是调用target_link_libraries。

下面举例,帮助理解

6 项目概述

  • 基于 小程序 源码, 可下载源码,对照参看
  • 小程序中,项目 EPA 需要 依赖动态库 OctExeDllVersion

7 OctExeDllVersion库-config.cmake文件

  • 作用,用于指定库的头文件所在位置、lib所在位置和dll文件所在位置。
  • 文件名: oct_edv-config.cmake
  • oct_edv-config.cmake文件内容:
# target_name: 项目名称, config_name:debug 或者 release , bin_root:dll所在路径, bin_name:动态库名, lib_root:lib文件路径, lib_name:lib库文件名
macro(set_lib_edv_properties target_name config_name bin_root bin_name lib_root lib_name)
	set_property(TARGET ${target_name} APPEND PROPERTY IMPORTED_CONFIGURATIONS ${config_name})

	# 指定动态库: 动态库文件
	set(bin_file ${bin_root}/${config_name}/${bin_name})
	
	# 指定 IMPORTED_LOCATION_<CONFIG> 属性
	set_target_properties(${target_name}
	PROPERTIES
	"IMPORTED_LOCATION_${config_name}" ${bin_file}
	)

	# 指定lib库文件
	set(lib_file ${lib_root}/${config_name}/${lib_name})
	
	# 指定 IMPORTED_IMPLIB_<CONFIG> 属性
	set_target_properties(${target_name}
	PROPERTIES
	"IMPORTED_IMPLIB_${config_name}" ${lib_file}
	)

endmacro()


# 指定根目录, CMAKE_CURRENT_LIST_DIR: 表示当前config.cmake文件所在路径
set(lib_edv_root 
${CMAKE_CURRENT_LIST_DIR}/..
)


if (NOT TARGET oct::edv)
	# 建库
	add_library(oct::edv SHARED IMPORTED)
endif()

if (TARGET oct::edv)

	# 指定头文件属性
	set_property(TARGET oct::edv PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${lib_edv_root}/include)

	# 指定lib库和dll文件属性
	set_lib_edv_properties( oct::edv DEBUG   ${lib_edv_root}/bin  "OctExeDllVersionD.dll" 	${lib_edv_root}/lib "OctExeDllVersionD.lib" )
	set_lib_edv_properties( oct::edv RELEASE ${lib_edv_root}/bin  "OctExeDllVersion.dll" 	${lib_edv_root}/lib "OctExeDllVersion.lib"   )

endif()
  • config.cmake文件看似很多代码, 其实很简单:
  • 1 建库 oct::edv
# 建库
	add_library(oct::edv SHARED IMPORTED)
  • 2 指定oct::edv头文件路径
# 指定头文件属性
	set_property(TARGET oct::edv PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${lib_edv_root}/include)
  • 3 指定 lib库文件和dll文件属性
	# 指定lib库和dll文件属性
	set_lib_edv_properties( oct::edv DEBUG   ${lib_edv_root}/bin  "OctExeDllVersionD.dll" 	${lib_edv_root}/lib "OctExeDllVersionD.lib" )
	set_lib_edv_properties( oct::edv RELEASE ${lib_edv_root}/bin  "OctExeDllVersion.dll" 	${lib_edv_root}/lib "OctExeDllVersion.lib"   )

8 设置 oct_edv-config.cmake路径

set(CMAKE_PREFIX_PATH 
${CMAKE_PREFIX_PATH}
"C:/major/development/tools/qt/5.14/install/5.14.2/msvc2015_64"
${common_cmake_root}
)
  • common_cmake_root 就是用于存放 edv-config.cmake文件的路径, 我这里是: path/CMAKE-EPA/publish/vcXX/x64/cmake

"C:/major/development/tools/qt/5.14/install/5.14.2/msvc2015_64" 是为了链接Qt的库文件

9 调用 find_package

  • 调用
# oct_edv
find_package(oct_edv REQUIRED)
  • find_package: 有两个参数: 参数1:oct_edv,其中,oct_edv来自oct_edv-config中'-' 前面的oct_edv,参数2: 指定该文件必须找到,否则,Find_package所在CMakeLists.txt脚本解析报错,不会继续执行find_package后面的CMake脚本内容

10 target_link_libraries 链接

  • 用法
# 需要链接 自己 专门修改exe和dll的动态库
target_link_libraries(${PROJECT_NAME}
	PRIVATE oct::edv
	)
  • 这里的 oct::edv 是来自 oct_edv-config.cmake 文件中 add_library所创建的项目 oct::edv

已按照上面的步骤顺序,完成库的链接。

附目录结构

.
├─Common
├─EPA
│  
├─OctExeDllVersion
|
└─publish
    └─vcXX
        └─x64
            ├─bin
            │  ├─Debug
            │  └─Release
            ├─cmake
            ├─include
            └─lib
                ├─Debug
                └─Release

Common - 存放通用的cmake脚本文件
EPA - 主程序
OctExeDllVersion - 动态库项目
publish - 动态库和可执行程序的输出目录

标签:cmake,lib,windows,config,c++,edv,root,oct
From: https://www.cnblogs.com/pandamohist/p/16995469.html

相关文章

  • Windows环境下安装和配置WNMP的Memcached
    PHP开发不是我最擅长的服务端语言,但是因为接触WordPress很早,了解到一个叫做 ​​WPJam​​​ - https://blog.wpjam.com/article/wordpress-memcached/ 的插件,后来他更......
  • python调用C++中的函数【最简明教程】
    python调用C++中的函数【最简明教程】操作环境:Linux,Ubuntu18.04注意,python将调用的C++函数cpp文件里面不应该有main函数,可以将原先的main函数换一个名字,在python中调......
  • c++ 通过ODBC连接达梦数据库
    安装达梦数据库建立数据源,位置:开始》》windows管理工具》》ODBC数据源  测试通过 打开编译器编写代码连接这个数据库 #include"stdafx.h"#include<Windows.......
  • Windows下Nginx的安装与使用(一):配置端口转发
    Nginx配置Nginx入门Nginx负载均衡Nginx端口转发什么是端口转发当我们在服务器上搭建一个图书以及一个电影的应用,其中图书应用启动了8001端口,电......
  • HP笔记本无法休眠问题,或者黑屏后无法唤醒,在windows10(win10)系统下
    1可以找找其他的博文里面关于离开模式的设置修改注册表关闭HKEY_LOCAL_MacHINESYSTEMCurrentControlSetControlSessionManagerPowerAwayModeEnabled键值:0,关闭1,开......
  • C++实现单链表相关操作
    #include<iostream>#include<cstdlib>//C++动态分配存储空间usingnamespacestd;#defineOK1#defineERROR0#defineMAXSIZE100typedefintElemtype;typedefintStat......
  • windows 启动
     windows启动过程windows7启动过程:简略版:BIOS自检--载入运行MBR--读取DPT,找活动分区(磁盘分区表)--进入活动分区载入运行PBR(分区引导记录)--移权Bootmgr--读取BCD--......
  • C++| 1-RAII
     RAII,完整的英文是ResourceAcquisitionIsInitialization,是C++所特有的资源管理方式。RAII依托栈和析构函数,来对所有的资源——包括堆内存在内——进行管理。对......
  • VScode配置支持c++11和配置自动编译调试功能
    VScode配置支持c++11和配置自动编译调试功能​​1在工程目录下新建.vscode目录​​​​2在.vscode目录下创建c_cpp_properties.json文件内容如下​​​​2.1添加c_cpp_pr......
  • Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统
    Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统​​0.环境​​​​1.MQTT源码下载(也可以去官网下载)​​​​2.MQTT源码解压成功复制src/mqtt文件夹到工程中​......