使用cmake构建VS工程并进行工程管理

2023-05-16

文章目录

  • 1.综述
  • 2.具体实施过程
    • 2.1 管理所有库的.dll
    • 2.2 管理所有依赖库的cmake_module
    • 2.3 工程构建
    • 2.4 参考

1.综述

在windows平台进行c++项目构建时,通常会采用vs的IDE集成开发环境.针对添加项目所依赖的第三方库通常我们的做法是:
  1.下载相关第三方库,添加库的dll文件到系统环境变量;
  2.重启电脑,使环境变量生效;
  3.打开vs工程,添加项目所依赖的库的头文件路径,库文件路径以及库名称;
  4.重复步骤3配置debug/release环境;

此方法的不利之处:
  1.如果后期依赖库比较到,则需要针对每个库都进行系统环境变量的添加;
  2.后期如果有别的工程使用添加好的第三方库,需要重新进行上面步骤2和3的配置;

因此,此篇文章主要针对构建项目的如上问题,采用cmake进行工程管理;

2.具体实施过程

具体构建目录如下所示,以下都采用此目录进行说明:

AllThirdPartyDll
	libName1_1.dll
	libName1_2.dll
AllThirdPartyLib
	cmake
		FindlibName1.cmake
	libName1
		bin
			libName1_1.dll
			libName1_2.dll
		include
			libName1.h
		lib
			libName1_1.lib
			libName1_2.lib
			libName1_1d.lib
			libName1_2d.lib

2.1 管理所有库的.dll

1.新建文件夹,比如文件名称为AllThirdPartyDll.将此文件夹添加到环境变量,重启电脑使之生效;
2.以后项目中依赖任何第三方库时,只需要将所需要使用的库的dll文件放到此文件夹下就可以了,免去了重新针对每个依赖库都进行环境变量的添加以及电脑的重启;

2.2 管理所有依赖库的cmake_module

构建cmake_module如下:此处以构建libName1库为例:

# FindlibName1
# --------
# 此处定义libName1为库名,后期可根据自己需要进行更改
# --------
# Find libName1 includes and libraries.  Once done this will define
#
#   libName1_INCLUDE_DIR     - where to find headers
#   libName1_LIBRARY         - where to find library
#
# An includer may set libName1_ROOT to a libName1 installation root to tell this
# module where to look.

#此处修改设置libName1目录
set(libName1_ROOT "${CMAKE_CURRENT_LIST_DIR}/../libName1")

#此处设置头文件
set(libName1_INCLUDE_DIR ${libName1_ROOT}/Include/)

#此处设置release库文件
find_library(libName1_LIBRARY_RELEASE NAMES 
	libName1_1
	libName1_2
	HINTS ${libName1_ROOT}/lib)
	
#此处设置debug库文件
find_library(libName1_LIBRARY_DEBUG NAMES 
	libName1_1d
	libName1_2d
	HINTS ${libName1_ROOT}/lib)


if(libName1_LIBRARY_RELEASE)
	set(libName1_LIBRARY optimized ${libName1_LIBRARY_RELEASE})
endif()
if(libName1_LIBRARY_DEBUG)
	set(libName1_LIBRARY ${libName1_LIBRARY} debug ${libName1_LIBRARY_DEBUG})
endif()

mark_as_advanced(
	libName1_LIBRARY
	libName1_INCLUDE_DIR)

if(libName1_LIBRARY)
	message(STATUS "Found libName1_LIBRARY: ${libName1_LIBRARY}")
endif()

# handle the QUIETLY and REQUIRED arguments and set PNG_FOUND to TRUE if
# all listed variables are TRUE
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(
	libName1 REQUIRED_VARS libName1_LIBRARY libName1_INCLUDE_DIR)

if(libName1_FOUND)
	set(libName1_INCLUDE_DIRS ${libName1_INCLUDE_DIR})
	set(libName1_LIBRARIES  ${libName1_LIBRARY})
	message(STATUS "libName1 FOUND")
else(libName1_FOUND)
	message("libName1 NOT FOUND")
endif()


2.3 工程构建

根据以上设置只需要在调用此库之前,在CMakeLists.txt文件里添加如下语句,即可进行第三方依赖库的调用

list(APPEND CMAKE_MODULE_PATH "D:/AllThirdPartyLib/cmake/")
find_package(libName1 REQUIRED)

include_directories(
  ${libName1_INCLUDE_DIR}
  )

target_link_libraries(projectName  
  ${libName1_LIBRARY}
  )

2.4 参考

参考1

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

使用cmake构建VS工程并进行工程管理 的相关文章

随机推荐