文章目录
- 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(使用前将#替换为@)