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

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

1 概述

本节目标: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"   )

这里用到了 CMAKE 宏 macro。 cmake中与宏对应的还有函数 function。下一文详解

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脚本内容
  • 用法
# 需要链接 自己 专门修改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 - 动态库和可执行程序的输出目录

11 完整 cmake脚本内容

cmake_minimum_required(VERSION 3.23)

project(EPA)

set(CMAKE_PREFIX_PATH 
${CMAKE_PREFIX_PATH}
"C:/major/development/tools/qt/5.14/install/5.14.2/msvc2015_64"
${common_cmake_root}
)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(${linguist_cmake})

# SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)

set(QT_VERSION 5)
# set(REQUIRED_LIBS Core Gui Widgets)
set(REQUIRED_LIBS_QUALIFIED Core Gui Widgets Sql)

# CMAKE包查找
find_package(Qt${QT_VERSION} COMPONENTS ${REQUIRED_LIBS_QUALIFIED} REQUIRED)
find_package(oct_edv REQUIRED)

# 指定源码目录
set(proj_root
	${CMAKE_CURRENT_SOURCE_DIR}/src
)


# 有这些文件需要纳入编译: 不推荐这样用, 应该一个一个文件的手动加入到这里
file(GLOB_RECURSE 
epa_files 
${proj_root}/*.h
${proj_root}/*.cpp
${proj_root}/*.inl
)

# 设置build输出目录 PROJECT_BINARY_DIR
set(project_bin_root
	${CMAKE_CURRENT_SOURCE_DIR}/resource
)

# 目标目录下的qrc
set(project_qrc
${project_bin_root}/epa.qrc
)



# 拷贝资源到输出目录

# 创建可执行程序项目
add_executable(${PROJECT_NAME} 
${epa_files}
${project_qrc}
)

# 翻译文件
set(proj_ts_file 
	${CMAKE_CURRENT_SOURCE_DIR}/lang/zh_CN.ts
)

# 添加翻译
# 参数1 项目名称, 参数2:输出目录下的qrc, 参数3: ts文件, 参数4:, 参数5:要翻译哪些文件夹
create_qm_file(${PROJECT_NAME} ${project_qrc} ${proj_ts_file} ${project_bin_root}/lang ${proj_root})



# 指定头文件搜索路径
target_include_directories(${PROJECT_NAME}
PRIVATE ${proj_root}
)

# 链接Qt库
target_link_libraries(${PROJECT_NAME}
	PRIVATE Qt${QT_VERSION}::Sql Qt${QT_VERSION}::Widgets Qt${QT_VERSION}::Core Qt${QT_VERSION}::Gui
)

# 需要链接 自己 专门修改exe和dll的动态库
target_link_libraries(${PROJECT_NAME}
	PRIVATE oct::edv
	)


# 拷贝配置文件到输出路径
copy_folder_macro(${CMAKE_CURRENT_SOURCE_DIR}/fr ${pbd})
copy_folder_macro(${CMAKE_CURRENT_SOURCE_DIR}/fr ${pbr})
# query
copy_folder_macro(${CMAKE_CURRENT_SOURCE_DIR}/vswhere ${pbd})
copy_folder_macro(${CMAKE_CURRENT_SOURCE_DIR}/vswhere ${pbr})



# 如果是windows,设置管理员权限。注意使用if需要配合endif使用
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
	set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/level='requireAdministrator'" )
endif()

# 关闭控制台
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
	set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
endif()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Windows下安装CMake可以按照以下步骤进行: 1. 下载CMake安装包:在CMake官网https://cmake.org/download/上下载适合你的操作系统的最新版CMake安装包。 2. 安装CMake:运行下载的安装包,按照提示进行安装。默认情况下,CMake将被安装到C:\Program Files (x86)\CMake目录下。 3. 将CMake添加到系统路径:将CMake的bin目录添加到系统路径中,以便在命令行中使用CMake命令。具体操作如下: a) 打开控制面板,选择“系统和安全” -> “系统” -> “高级系统设置”。 b) 在“高级”选项卡中,单击“环境变量”按钮。 c) 在“系统变量”中找到“Path”,单击“编辑”按钮。 d) 在编辑环境变量窗口中,单击“新建”按钮,并添加CMake的bin目录路径(例如:C:\Program Files (x86)\CMake\bin)。 e) 保存更改并关闭所有窗口。 4. 验证CMake是否成功安装:打开命令行窗口,输入“cmake --version”命令,如果显示了CMake的版本信息,则说明安装成功。 这样就完成了在Windows下安装CMake的步骤。 ### 回答2: CMake是一个工具,可以帮助程序员管理他们的项目。它是一个开源工具,主要用于C和C++代码的构建过程。本文将介绍如何在Windows操作系统上安装CMake。 第一步:下载CMake 首先需要下载CMake的安装程序。可以从CMake官方网站 https://cmake.org/download/ 下载最新版本。一般情况下,选择Win32或Win64程序版本即可。 第二步:执行安装程序 运行下载的安装程序(.exe文件),接受用户协议,并选择安装选项(推荐使用默认选项)。此外,安装程序还会询问添加CMake到系统的环境变量中,用户可以根据需要选择。 第三步:检查安装 安装程序执行该过程后便可以退出,用户需要检查CMake是否正常安装。可以在命令提示符下执行以下命令: ``` cmake --version ``` 如果CMake已正确安装,则会显示CMake的版本信息。 第四步:创建CMake工程 在Windows系统上使用CMake编译代码时,需要执行以下步骤: 1. 创建一个新的文件夹(例如,C:\CMakeExample) 2. 在该文件夹下创建源代码文件(例如,hello.cpp) 3. 创建CMakeLists.txt文件,该文件包含CMake的构建配置。该文件应放置在与源代码文件相同的文件夹。 示例CMakeLists.txt文件: ``` cmake_minimum_required(VERSION 3.10) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True) project(Hello) add_executable(Hello hello.cpp) ``` 4. 在命令提示符下,导航到项目目录(例如,C:\CMakeExample) 5. 执行以下命令生成Visual Studio项目: ``` cmake -G "Visual Studio 16 2019" . ``` 6. 执行以下命令编译项目: ``` cmake --build . --config Release ``` 这将生成一个包含编译可执行文件的文件夹。 总结 如上所述,WindowsCMake的安装过程非常简单。用户只需要下载并安装官方安装程序,依照默认选项进行安装即可。在CMake安装完成后,用户需要学习如何配置CMakeLists.txt文件以及如何在命令提示符下执行CMake命令,以构建可执行程序。 ### 回答3: CMake是一款用于管理C++程序的开源工具,能够跨平台编译和构建代码。本篇文章将介绍在Windows操作环境下如何安装使用CMake。 第一步:下载安装包 首先需要下载CMake的安装包,可以从官网https://cmake.org/download/ 下载安装文件。在这里我们选择下载最新版本的CMake 3.20.3 for Windows x86_64。 第二步:安装CMake 双击安装包,按照提示下一步进行安装。需要注意的是,在安装过程中会出现设置环境变量的选项,勾选选项后CMake将自动配置环境变量。 第三步:验证安装 安装完成后,在命令提示符中输入cmake --version命令验证是否安装成功。 如果出现CMake的版本号,则说明已经成功安装。如果出现“‘cmake’ is not recognized as an internal or external command”,则需要手动配置环境变量。 第四步:设置环境变量 如果CMake的执行没有被加入环境变量中,我们需要手动设置环境变量: 1. 打开“此电脑(C)”的属性,选择“高级系统设置”。 2. 在“系统属性”对话框中,选择“环境变量”。 3. 在“系统变量”中找到Path变量,选择“编辑”按钮。 4. 在编辑“Path”对话框中,选择“新建”,输入CMake的路径。例如:C:\Program Files\CMake\bin 5. 点击“确定”按钮并保存更改。 6. 打开命令提示符,输入cmake --version命令检查是否配置成功。 总结: 以上就是在Windows操作系统下安装并使用CMake的基本方法。如果在使用过程中遇到任何问题,可以查看CMake官方文档或者参考网上教程。CMake不仅适用于Windows操作系统,也可以应用于各种平台,我们可以根据需要选择不同平台的版本进行安装。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值