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

У меня проблема с тем, чтобы заставить 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

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

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


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


Ответы (1)


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

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

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

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

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

person DLRdave    schedule 20.09.2013