Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как установить компоновщик MSVC в CMake с помощью MSYS

Автор вопроса: HellhoundОтветов: 1

У меня проблема с тем, чтобы заставить CMake использовать компоновщик MSVS вместо компоновщика MinGW. Для поддержки MSVC в MSYS я реализовал сценарий bash, заставляющий CMake использовать компилятор MSVC для создания файлов NMake:

cmake -G "NMake Makefiles" -DMSVC=true -DCOMPILER_ROOT=$COMPILER_ROOT -DCMAKE_PROFILE=$CMAKE_PROFILE -DCMAKE_BUILD_TYPE=$CMAKE_DEBUG -DCMAKE_CXX_LINKER=$COMPILER_ROOT/bin/linker.exe

CMake правильно использует компилятор MSVC и создает файлы NMake, как и ожидалось:

$ sh build.sh -msvc /c/binrev/development/vs2010/VC -p
removing CMakeCache.txt
removing temporary directory CMakeFiles
Create MSVC based NMake files.
-- The C compiler identification is MSVC
-- The CXX compiler identification is MSVC
-- Check for CL compiler version
-- Check for CL compiler version - 1600
-- Check if this is a free VC compiler
-- Check if this is a free VC compiler - no
-- Check for working C compiler: c:/binrev/development/vs2010/VC/bin/cl.exe
-- Check for working C compiler: c:/binrev/development/vs2010/VC/bin/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: c:/binrev/development/vs2010/VC/bin/cl.exe
-- Check for working CXX compiler: c:/binrev/development/vs2010/VC/bin/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
Execute: brCore.cmake
Linker path CMAKE_CXX_LINKER: c:/binrev/development/vs2010/VC/bin/link.exe

Но при вызове nmake CMAKE по-прежнему использует компоновщик MinGW:

Linking CXX shared library bin\brCore.dll
c:\binrev\development\mingw\bin\ld.exe: unrecognized option '-Wl,--enable-auto-import'
c:\binrev\development\mingw\bin\ld.exe: use the --help option for usage information
LINK failed. with 1
NMAKE : fatal error U1077: "c:\binrev\development\cmake\bin\cmake.exe": Rückgabe-Code  "0xffffffff"
Stop.
NMAKE : fatal error U1077: "c:\binrev\development\vs2010\VC\BIN\nmake.exe": Rückgabe-Code "0x2"
Stop.
NMAKE : fatal error U1077: "c:\binrev\development\vs2010\VC\BIN\nmake.exe": Rückgabe-Code "0x2"
Stop.

После вызова сценария оболочки bash в CMakeCache вместо компоновщика MSVC устанавливается компоновщик MinGW:

//Path to a program.
CMAKE_LINKER:FILEPATH=c:/binrev/development/mingw/bin/ld.exe

Хорошо, я понял, что мне нужно установить переменную CMAKE_LINKER вместо CMAKE_CXX_LINKER, чтобы получить правильную зависимость. Но теперь я получил еще один провал:

Linking CXX shared library bin\brCore.dll
Das System kann die angegebene Datei nicht finden
mt.exe : general error c10100b1: Failed to load file "bin\brCore.dll". Das System kann  die angegebene Datei nicht finden.
MT failed. with 31

Кто-нибудь знает, что я сделал неправильно? Спасибо за любую помощь.

С уважением, Адская гончая

  • Нужно ли запускать эту сборку в оболочке MSYS? Почему бы не использовать командную строку Visual Studio в качестве оболочки, если вы все равно используете компилятор MSVC и nmake...? DLRdave 02.12.2011
  • Я запускал это в оболочке MSYS, а также использую для GCC. Я попробую командную строку VS в качестве оболочки. Hellhound 20.12.2011
  • Я попытался запустить это без использования оболочки MSYS, выполнив сценарий cmake из командной строки Visual Studio. Тот же эффект, компоновщик пытается использовать компоновщик MinGW... Hellhound 16.01.2012

visual-studio-2010cmakemsys

Ответы

Ответ 1 · DLRdave

Это звучит как классическое "более одной вещи с одним и тем же именем" в проблеме PATH, причем "неправильная" находится в PATH первой.

Если вы поместите каталог с инструментами MS перед PATH, у вас все равно возникнет такая же проблема?

Если вы введете "какая ссылка" в приглашении MSYS bash, какой файл будет первым в среде?

Инструменты от Microsoft, вероятно, ненадежны по сравнению с другими инструментами с теми же именами, которые находятся в PATH. (т. е. -- возможно, mt.exe просто вызывает "link.exe" и ожидает, что он будет в PATH, и не полностью определяет его, чтобы обеспечить необходимый ему link.exe...) То же самое для инструментов MSYS.

Вам действительно нужно тщательно настроить среду сборки, чтобы избежать подобных проблем, когда на одной машине установлено несколько сред разработки.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы