如何解决从 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 举报,一经查实,本站将立刻删除。