在开发c++项目时,我们个人都会使用Visual Studio来进行开发任务,VS对于项目的配置编译管理等无疑都是非常方便的,现在的VS版本也是非常的多,由于使用习惯或者项目环境需要,许多人也都在使用着不同的版本;这样当我们在多人协同工作时,可能会因为VS的版本不统一而导致工程的编译环境的改变而不能使代码进行统一的管理;所以我们就需要使用CMake来管理我们的源代码,CMake是一款优秀的跨平台构建工具,在一般的C++开源项目中也是最常用的,其次就是CMake优秀的跨平台性,所以一些跨平台性的项目也会用CMake来进行管理。
下载地址:https://cmake.org/download/
下载自己合适的版本
安装过程可以直接下一步即可,安装简单。
vcpkg首先要到github下载工程:https://github.com/microsoft/vcpkg.git
使用GIT命令下载:git clone https://github.com/microsoft/vcpkg.git;
1、下载完成后,我们执行目录中的“bootstrap-vcpkg.bat”,执行成功后目录中会多出一个“vcpkg.exe”的文件。
2、配置环境变量,将下载的目录添加到环境变量:path—>D:\vcpkg
配置完成后,可以打开命令窗口,输入 vcpkg version 查看
3、安装与VS绑定的功能,为了让vs可以使用,需要在命令行窗口中执行 vcpkg integrate install 命令。
这样我们在VS项目属性页就可以看到vcpkg的配置了
为了防止显示问题,最好在Visual Studio中装个英文语言包。
4、常用命令
查看库
vcpkg list
搜索库
vcpkg search xxx
安装库
命令行 vcpkg install 【库名】
vcpkg install xyz:x64-windows --recurse
卸载库
vcpkg remove xyz:x64-windows --recurse
CMake的所有语句都写在一个CMakeLists.txt的文件中,CMakeLists.txt文件确定后,就可以使用CMake工具直接进行运行,从而生成我们的VS项目。
其中在MasterMain主程序文件目录和ClassLib类库中也有一个CMakeLists.txt文件,用于生成主程序与类库项。
所以这里会分为大概三个不同的CMakeLists.txt配置方式,项目、主工程、类库。
在下面代码中,因为将vcpkg配置在了d盘下,所以在设置“VCPKG_ROOT_DIR”时为“d:/vcpkg”。
# Copyright (c) 2022 MyProject authors.
# 设置CMake最小兼容版本
cmake_minimum_required(VERSION 3.13)
# 设置VCPKG目录
set(VCPKG_ROOT_DIR "D:/vcpkg" CACHE PATH "set vcpkg path")
set(CMAKE_TOOLCHAIN_FILE "${VCPKG_ROOT_DIR}/scripts/buildsystems/vcpkg.cmake")
project(MyProject C CXX)
# 不允许在代码目录构建
if (${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
message(FATAL_ERROR "在源代码目录构建不允许.")
endif()
# 生成类型
if(NOT CMAKE_BUILD_TYPE)
SET(CMAKE_BUILD_TYPE Release CACHE STRING "选择构建类型, 选项: None Debug Release RelWithDebInfo MinSizeRel." FORCE)
endif(NOT CMAKE_BUILD_TYPE)
if(MSVC)
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
endif()
set(CMAKE_CXX_STANDARD 11)
# 启用OPM
FIND_PACKAGE(OpenMP REQUIRED)
if(OPENMP_FOUND)
message(STATUS "OPENMP FOUND")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
# Enable multi cpu compile for msvc.
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
add_compile_options(/MP)
endif()
# Disable compiler optimizition for RelWithDebInfo
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Od")
# 设置编译库后缀
SET(CMAKE_DEBUG_POSTFIX "d" CACHE STRING "add a postfix, usually d on windows")
SET(CMAKE_RELEASE_POSTFIX "" CACHE STRING "add a postfix, usually empty on windows")
SET(CMAKE_RELWITHDEBINFO_POSTFIX "rd" CACHE STRING "add a postfix, usually empty on windows")
SET(CMAKE_MINSIZEREL_POSTFIX "s" CACHE STRING "add a postfix, usually empty on windows")
# 设置动态库与静态库目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/output/Release/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/output/Release/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/output/Release/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/output/Debug/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/output/Debug/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/output/Debug/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/output/RelWithDebInfo/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/output/RelWithDebInfo/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO ${CMAKE_BINARY_DIR}/output/RelWithDebInfo/bin)
# 包含目录
include_directories(${CMAKE_BINARY_DIR}/include)
# 添加子目录
add_subdirectory(ClassLib)
add_subdirectory(MasterMain)
# 设置工程名,在主项目CMakeLists.txt中引用会使用此名称
set(PROJECT_NAME MasterMain)
project(${PROJECT_NAME} LANGUAGES C CXX )
# 添加qt依赖
find_package(Qt5 COMPONENTS Core Gui Widgets AxContainer)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
#查找设置当前文件夹中所有的头文件
FILE(GLOB HEAD_FILES "./*.h")
#查找当前文件夹中的所有源代码文件,也可以通过Set命令将所有文件设置为一个变量
FILE(GLOB SRC_FILES "./*.cpp")
#查找设置当前文件夹中所有的ui文件
FILE(GLOB UI_FILES "./*.ui")
#查找设置当前文件夹中所有的qrc文件
FILE(GLOB QRC_FILES "./*.qrc")
#通过Ui文件生成对应的头文件,一定要添加
qt5_wrap_ui(WRAP_FILES ${UI_FILES})
source_group("Source Files" FILES ${SRC_FILES})
source_group("Header Files" FILES ${HEAD_FILES})
source_group("Ui Files" FILES ${UI_FILES})
source_group("Resource Files" FILES ${QRC_FILES})
add_executable(${PROJECT_NAME} ${HEAD_FILES} ${SRC_FILES} ${UI_FILES} ${QRC_FILES})
add_definitions(-DQT_DEPRECATED_WARNINGS)
add_definitions(-DTOWER_MATCH_DLL_LINKING)
target_include_directories(${PROJECT_NAME}
PRIVATE
)
target_link_libraries(${PROJECT_NAME}
PRIVATE
Qt5::Core
Qt5::Gui
Qt5::Widgets
Qt5::AxContainer
ClassLib #这里引用我们的类库
)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:\"mainCRTStartup\"")
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
# 设置默认打开VCPKG
set_target_properties(${PROJECT_NAME} PROPERTIES VS_GLOBAL_VcpkgEnabled true)
在上面的配置代码中包含了配置项目在VS中默认启用VCPKG的代码,set_target_properties(${PROJECT_NAME} PROPERTIES VS_GLOBAL_VcpkgEnabled true),这里一定要设置,不然编译出来的项目可能会因为访问不到VCPKG库而执行不成功。
相较与上面的项目配置与主工程配置,这里类库的配置与主工程配置类似只是会少一些UI文件的管理
set(PROJECT_NAME ClassLib)
project(${PROJECT_NAME} LANGUAGES C CXX)
find_package(Qt5 COMPONENTS Core Gui Widgets Xml Sql AxContainer)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
#查找设置当前文件夹中所有的头文件
FILE(GLOB HEAD_FILES "./*.h")
#查找当前文件夹中的所有源代码文件,也可以通过Set命令将所有文件设置为一个变量
FILE(GLOB SRC_FILES "./*.cpp")
add_definitions(-DPOINTCLOUD_LIB)
add_library(${PROJECT_NAME} SHARED ${HEAD_FILES} ${SRC_FILES})
target_include_directories(${PROJECT_NAME}
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
)
target_link_libraries(${PROJECT_NAME}
PUBLIC
Qt5::Core
Qt5::Gui
Qt5::Widgets
Qt5::Xml
Qt5::Sql
Qt5::AxContainer
)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:WINDOWS /ENTRY:\"mainCRTStartup\"")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)
set_target_properties(${PROJECT_NAME} PROPERTIES VS_GLOBAL_VcpkgEnabled true)
在将配置文件都编写完成后,我们就可以打开cmake来对代码进行编译了,这里我只是建立了一个主工程目录和一个类库目录,其中引用方法都已经在上面的配置中有说明,如果您的工程项目类库比较多,也可以多建立一些进行相同的办法配置与管理;那么下面我们来使用cmake一起来编译下吧!
下面是我建的项目的目录树,供大家参考
编译时我们先要打开CMake,在源代码框中输入我们的项目目录和构建目录,构建目录框中文件夹CMake会自动创建。
设置完成后,点击"Configure"弹出如下窗口,Optional platform for generator中选择x64,点击确定。
待“Configure”执行完成后,再点击“Generate”如下图所示即是编译成功
此时点击“Open Project”或者在生成的build文件夹中打开MyProject.sln即可打开工程。
到这里我们的CMake+vcpkg的配置这里就完成了,如果大家觉得我的方法还有用的话,也请大家能够点赞鼓励一下,您的鼓励是我分享的动力,谢谢各位!