CMake корректно работает на MSV C только с опцией g ++ - PullRequest
0 голосов
/ 13 января 2020

Когда я удаляю опции -g и -O3 из CMakeLists.txt, мой MSV C завершается с большим количеством ошибок, таких как:

libcpmt.lib(xwcscoll.obj) : error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MD_DynamicRelease' in ExamplesTest.obj

Я не понимаю эту странную ошибку, потому что она явно напишите:

ignoring unknown option '-g' и ignoring unknown option '-O3'

CMakeLists.txt, который работает

cmake_minimum_required(VERSION 3.0)
project(NeuralNetwork CXX)
set(CMAKE_CXX_STANDARD 17)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()

if(MSVC)
  message("-- CMake run for msvc")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libboost_serialization-vc142-mt-x64-1_71.lib")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libboost_serialization-vc142-mt-gd-x64-1_71.lib")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libboost_serialization-vc142-mt-sgd-x64-1_71.lib")
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi")
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2")
endif()

set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")

add_subdirectory(src)
add_subdirectory(tests)

CMakeLists.txt, который не ' t работа

cmake_minimum_required(VERSION 3.0)
project(NeuralNetwork CXX)
set(CMAKE_CXX_STANDARD 17)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()

if(MSVC)
  message("-- CMake run for msvc")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libboost_serialization-vc142-mt-x64-1_71.lib")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libboost_serialization-vc142-mt-gd-x64-1_71.lib")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libboost_serialization-vc142-mt-sgd-x64-1_71.lib")
  set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Od /Zi")
  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2")
else()
  message("-- CMake run for g++")
  set(CMAKE_CXX_FLAGS_DEBUG "-g")
  set(CMAKE_CXX_FLAGS_RELEASE "-O3")
endif()

add_subdirectory(src)
add_subdirectory(tests)

Можете ли вы объяснить мне, что сделал CMake как дополнительный шаг в рабочем случае?

Редактировать: Я протестировал, восстановил, и почистил несколько раз, я почти уверен, что оттуда исходит ошибка.

1 Ответ

0 голосов
/ 25 января 2020

Это потому, что set(CMAKE_CXX_FLAGS_DEBUG "-g") и set(CMAKE_CXX_FLAGS_RELEASE "-O3") перегружают существующие настройки. Я просто устанавливаю значение для CMAKE_CXX_FLAGS_RELEASE и CMAKE_CXX_FLAGS_RELEASE, когда я компилирую с MSV C.

if(MSVC)
  message("-- CMake run for msvc")
  set(CMAKE_CXX_FLAGS_RELEASE "/O2 /MT")
  set(CMAKE_CXX_FLAGS_DEBUG "/Od /Zi /MTd")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libboost_serialization-vc142-mt-x64-1_71.lib")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libboost_serialization-vc142-mt-s-x64-1_71.lib")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libboost_serialization-vc142-mt-gd-x64-1_71.lib")
  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:libboost_serialization-vc142-mt-sgd-x64-1_71.lib")
else()
  #set(CMAKE_CXX_FLAGS "-Wall -Wextra")
  set(CMAKE_CXX_FLAGS_DEBUG "-g")
  set(CMAKE_CXX_FLAGS_RELEASE "-O3")
endif(
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...