微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 Visual Studio 2017 迁移到 2019,遇到 /MP 标志并实现 32 位构建的问题?

如何解决从 Visual Studio 2017 迁移到 2019,遇到 /MP 标志并实现 32 位构建的问题?

所以我一直在尝试将我的 Qt/C++ 项目从 MSVC 2017 迁移到 MSVC 2019,这是一段艰难的时期。尝试在 Visual Studio 2019 中构建时出现以下错误

2>cl : command line warning D9002: ignoring unkNown option '/mp'

我之前在使用 Visual Studio 2017 时没有收到此错误,所以很奇怪。我非常需要这个标志,因为没有它我的编译时间要慢 10 倍以上。稍微不同的是,我也不太清楚如何使构建成为 32 位,但一次只做一件事。我的 cmake 文件如下所示:

# CMake build

# Project-level setup ====================================================
project( engine ) # Todo: Set version
cmake_minimum_required( VERSION 3.16 )
set(TARGET_NAME "engine")
set(TEST_TARGET_NAME "engine_tests")

# Find includes in corresponding build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

# Instruct CMake to run moc automatically when needed.
set(CMAKE_AUTOMOC ON) # Saves having to use QT5_WRAP_CPP
set(CMAKE_AUTORCC ON) # Saves having to use QT5_ADD_RESOURCES
set(CMAKE_AUTOUIC ON) # Saves having to use QT5_WRAP_UI

# Set compiler flags =====================================================
# Use C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_required ON)

# Todo: 64 bit
if (MSVC)
    add_compile_options(/mp /bigobj /wd4577 /wd4467 /wd26812 /wd26812)
else()
endif()

# Set paths to find Qt ===================================================
# Find Qt itself
if(${CMAKE_SYstem_NAME} MATCHES "Windows")
    # set(QT_MSVC_2017 "C:\\Qt\\5.12\\5.12.2\\msvc2017")
    set(QT_MSVC_2019 "C:\\Qt\\5.15\\5.15.2\\msvc2019")
    
    set(CMAKE_PREFIX_PATH ${QT_MSVC_2019})
else()
    message (WARNING "-------- System not supported ---------")
endif()

# Find UI files
set(CMAKE_AUTOUIC_SEARCH_PATHS "${CMAKE_CURRENT_SOURCE_DIR}/ui")

# Find required Qt Libraries =============================================
find_package(Qt5 COMPONENTS Core required)# Core stuff
find_package(Qt5 COMPONENTS Concurrent required) # For threading
find_package(Qt5 COMPONENTS Gamepad required) # Controller support
find_package(Qt5 COMPONENTS Gui required) # For OpenGL integration
find_package(Qt5 COMPONENTS OpenGLExtensions required)
find_package(Qt5 COMPONENTS Multimedia required) # Multimedia capabilities
find_package(Qt5 COMPONENTS Multimediawidgets required)
find_package(Qt5 COMPONENTS Widgets required) # For widgets

# OpenGL libraries
# See: https://stackoverflow.com/questions/65100749/converting-from-qmake-to-cmake-how-do-i-find-libraries-in-the-same-way/65106458#65106458
find_package(OpenGL required) # enforces as a requirement

# Set build mode directory options ========================================
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}/debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/release)

# Set directories to find libraries,need to do this before add_executable for desired target
file(TO_CMAKE_PATH "$ENV{PYTHON_LIB}" ENV_PYTHON_LIB)
message(STATUS "Setting link directory ${ENV_PYTHON_LIB}")
link_directories(${ENV_PYTHON_LIB})

# Build EXE ===============================================================
message (STATUS "-------- Finding source,header,resource,UI files relative to  ${CMAKE_SOURCE_DIR} ---------")
file(GLOB_RECURSE MY_SOURCES RELATIVE ${CMAKE_SOURCE_DIR} "src/*.cpp"  "src/*.h"
"resources/*.qrc" "ui/*.ui")

# Get all the source files to build the test suite
file(GLOB_RECURSE MY_TEST_SOURCES RELATIVE ${CMAKE_SOURCE_DIR} "src/*.cpp" "src/*.h" "resources/*.qrc" "ui/*.ui" "tests/*.cpp" "tests/*.h")
list(FILTER MY_TEST_SOURCES EXCLUDE REGEX "src/main.cpp")


# Generate release PDB
# https://stackoverflow.com/questions/28178978/how-to-generate-pdb-files-for-release-build-with-cmake-flags/31264946
add_compile_options("$<$<NOT:$<CONfig:Debug>>:/Zi>")
add_link_options("$<$<NOT:$<CONfig:Debug>>:/DEBUG>")
add_link_options("$<$<NOT:$<CONfig:Debug>>:/OPT:REF>")
add_link_options("$<$<NOT:$<CONfig:Debug>>:/OPT:ICF>")

# Add an executable to be built from sources variable
# add_executable(${TARGET_NAME} ${MY_SOURCES})
add_executable(${TARGET_NAME} WIN32 ${MY_SOURCES}) # Makes sure that this is a windows application,not a console app
add_executable(${TEST_TARGET_NAME} ${MY_TEST_SOURCES})

# Pre-processor Defines ===================================================
add_deFinitions(-D_UNICODE -D_ENABLE_EXTENDED_ALIGNED_STORAGE -DWIN64 -DQT_DLL -DQT_OPENGL_LIB)
add_deFinitions(-DDEVELOP_MODE)
add_deFinitions(-DLINALG_USE_EIGEN)

# disable warnings about deprecated things,like using strcpy (sorry,not sorry)
if(MSVC)
    add_deFinitions(-D_CRT_SECURE_NO_WARNINGS)
endif()

# Command-line configuration ===================================================
set_target_properties(${TARGET_NAME} PROPERTIES VS_DEBUGGER_COMMAND_ARGUMENTS "${CMAKE_SOURCE_DIR}")

# Add additional include directories for including using src as root =======================================
target_include_directories(${TARGET_NAME} PRIVATE "${CMAKE_SOURCE_DIR}/src")
target_include_directories(${TEST_TARGET_NAME} PRIVATE "${CMAKE_SOURCE_DIR}/src")

########### Iterate over all targets to link libraries #################
foreach(current_target ${TARGET_NAME} ${TEST_TARGET_NAME})

# Set linker properties ===================================================
set(DEBUG_DEFinitioNS "DEBUG_MODE")
set(RELEASE_DEFinitioNS "QT_NO_DEBUG_OUTPUT")
target_compile_deFinitions(${current_target} PUBLIC
    $<$<CONfig:DEBUG>:${DEBUG_DEFinitioNS}>
    $<$<CONfig:RELEASE>:${RELEASE_DEFinitioNS}>
)

# Link required Qt modules to main target =================================
target_link_libraries(${current_target} OpenGL::GL OpenGL::glu)
target_link_libraries(${current_target} Qt5::Core)
target_link_libraries(${current_target} Qt5::Concurrent) 
target_link_libraries(${current_target} Qt5::Gamepad)
target_link_libraries(${current_target} Qt5::Gui)
target_link_libraries(${current_target} Qt5::OpenGLExtensions) # Todo: Probably unnecessary,remove
target_link_libraries(${current_target} Qt5::Multimedia)
target_link_libraries(${current_target} Qt5::Multimediawidgets)
target_link_libraries(${current_target} Qt5::Widgets)

# Add additional libraries ================================================
# stuff here
    

endforeach()

希望它非常简单,我正在构建一个主要项目和一个测试项目。我知道 cmake 人员非常不鼓励文件 GLOB,但我最终会手动输入我的文件路径。否则,这对我来说在 MSVC 2017 上工作得很好。之前(当我只安装了 Visual Studio 2017 时),使用以下方法调用 cmake 就足够了:

cmake -B"./app" -S"./my_project"

但现在我正在做以下事情:

cmake -B"./app" -S"./my_project" -G "Visual Studio 16 2019" -A Win32

据我所知,这应该给我我想要的,这是一个 32 位构建。但是,当我转到我的项目的配置属性时,Preferred Build Tool Architecture 仍然是 64 位。这与项目本身的构建有关吗?如果这不是问题,那就太好了!但是,我仍然不明白为什么不再识别 /MP 标志。

解决方法

试试/MP10

processMax 参数的范围必须在 1 到 65536 之间。否则,编译器会发出警告消息 D9014,忽略 processMax 参数,并假定最大进程数为 1。

https://docs.microsoft.com/en-us/cpp/build/reference/mp-build-with-multiple-processes?view=msvc-160

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。