KirillHelm
@KirillHelm

Почему CMake не генерирует файлы под MinGW без CMAKE_GNUtoMS флага?

Привет,
попытался забилдить для примера програмку под MinGW с помощью CMake.
Сначала возникла проблема, что CMake не видел компилятора, решилось банальным добавлением пути "C:\MinGW\bin" в переменную PATH. Ошибка ушла, тем не менее осталась ещё одна:
Error Log ↓
PS C:\test> cmake -G "MinGW Makefiles"
-- The C compiler identification is GNU 6.3.0
CMake Error at C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:495 (file):
  file STRINGS file "C:/test/CMakeFiles/3.11.0/CompilerIdCXX/a.exe" cannot be
  read.
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:37 (CMAKE_DETERMINE_COMPILER_ID_CHECK)
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCXXCompiler.cmake:107 (CMAKE_DETERMINE_COMPILER_ID)
  CMakeLists.txt:1 (project)


CMake Error at C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:501 (list):
  list sub-command REMOVE_DUPLICATES requires list to be present.
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:37 (CMAKE_DETERMINE_COMPILER_ID_CHECK)
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCXXCompiler.cmake:107 (CMAKE_DETERMINE_COMPILER_ID)
  CMakeLists.txt:1 (project)


CMake Error at C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:567 (file):
  file failed to open for reading (Invalid argument):

    C:/test/CMakeFiles/3.11.0/CompilerIdCXX/a.exe
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:37 (CMAKE_DETERMINE_COMPILER_ID_CHECK)
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCXXCompiler.cmake:107 (CMAKE_DETERMINE_COMPILER_ID)
  CMakeLists.txt:1 (project)


CMake Error at C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:569 (string):
  string begin index: 1 is out of range 0 - 0
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:37 (CMAKE_DETERMINE_COMPILER_ID_CHECK)
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCXXCompiler.cmake:107 (CMAKE_DETERMINE_COMPILER_ID)
  CMakeLists.txt:1 (project)


CMake Error at C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:577 (math):
  math cannot parse the expression: " * 16 + ": syntax error, unexpected
  exp_TIMES, expecting exp_PLUS or exp_MINUS or exp_OPENPARENT or exp_NUMBER
  (2)
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:37 (CMAKE_DETERMINE_COMPILER_ID_CHECK)
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCXXCompiler.cmake:107 (CMAKE_DETERMINE_COMPILER_ID)
  CMakeLists.txt:1 (project)


CMake Error at C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:579 (file):
  file failed to open for reading (Invalid argument):

    C:/test/CMakeFiles/3.11.0/CompilerIdCXX/a.exe
Call Stack (most recent call first):
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCompilerId.cmake:37 (CMAKE_DETERMINE_COMPILER_ID_CHECK)
  C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeDetermineCXXCompiler.cmake:107 (CMAKE_DETERMINE_COMPILER_ID)
  CMakeLists.txt:1 (project)


-- The CXX compiler identification is GNU 6.3.0
-- Check for working C compiler: C:/MinGW/bin/gcc.exe
-- Check for working C compiler: C:/MinGW/bin/gcc.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: C:/MinGW/bin/g++.exe
-- Check for working CXX compiler: C:/MinGW/bin/g++.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - failed
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring incomplete, errors occurred!
See also "C:/test/CMakeFiles/CMakeOutput.log".
See also "C:/test/CMakeFiles/CMakeError.log".

Вопрос решается банальным добавлением флага CMAKE_GNUtoMS при старте генерации CMake.
Но если честно, не понятно:
  1. Зачем нужен этот флаг, точнее почему без него нельзя? Документация не дает исчерпывающего ответа (да-да, конвертирует .dll.a в .lib, причем я так понимаю с прибеганием к помощи студийного компилятора, судя по этой статье. Хотелось бы без этого, объясните пожалуйста, если я не прав и что-то путаю).
  2. Полагаю так фиксить проблему не правильно, кто знает причину её возникновения и как её решить? К слову говоря, в PATH так же добавил пути "C:\MinGW\include".
  • Вопрос задан
  • 533 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы