2015-02-03 6 views
1

Когда я пытаюсь скомпилировать nlopt с Visual Studio Express 2013, используя предоставленные файлы CMake для Windows от website, конфигурация через cmake -DCMAKE_BUILD_TYPE=Release -DNLOPT_BUILD_SHARED=On -G"NMake Makefiles" .. в подкаталоге build работает отлично, но компиляции с помощью nmake терпит неудачу с этим сообщением об ошибке:nlopt не удается скомпилировать cobyla.c с MSVC 2012

[ 40%] Building C object CMakeFiles/nlopt.dir/cobyla/cobyla.c.obj 
cobyla.c 
e:\dev\nlopt\nlopt-2.4.1\cobyla\cobyla.c(1503) : fatal 
error C1001: An internal error has occurred in the compiler. 
(compiler file 'f:\dd\vctools\compiler\utc\src\p2\main.c', line 228) 
To work around this problem, try simplifying or changing the program near the l 
ocations listed above. 
Please choose the Technical Support command on the Visual C++ 
Help menu, or open the Technical Support help file for more information 
INTERNAL COMPILER ERROR in 'c:\MSVS12\VC\bin\cl.exe' 
    Please choose the Technical Support command on the Visual C++ 
    Help menu, or open the Technical Support help file for more information 
NMAKE : fatal error U1077: 'c:\MSVS12\VC\bin\cl.exe' : return code '0x1' 
Stop. 
NMAKE : fatal error U1077: 'c:\MSVS12\VC\bin\nmake.exe' : return code '0x2' 
Stop. 
NMAKE : fatal error U1077: 'c:\MSVS12\VC\bin\nmake.exe' : return code '0x2' 
Stop. 
ERROR: Build script of nlopt failed with errorcode 1. 

ответ

4

Когда я попытался создать проект nlopt, созданный CMake, с VC12 (компилятор в Visual Studio 2013) в режиме Release, я получил ошибку компиляции C1001 в cobyla.c Исправление исходило от https://connect.microsoft.com/VisualStudio/feedback/details/1028781/c1001-on-release-build. Мне нужно было поставить # прагма перед оскорбительной строкой в ​​cobyla.c.

i__1 = nact; 
#pragma loop(no_vector) //line 1503 
for (k = 1; k <= i__1; ++k) { 

С этим исправлением мне не нужно было удалять флаги оптимизации.

0

проблема заключается в оптимизации флага/O2, который вызывает cl.exe к сбою. Для компиляции cobyla.c только с/O1, выполните шаг CMake, как обычно, но затем измените следующий файл перед началом nmake:

В каталоге сборки открытой CMakeFiles/nlopt.dir/build.make и найти директиву, которая строит cobyla.c.obj

Там, около номера строк 522 изменений

$(C_DEFINES) /FoCMakeFiles\nlopt.dir\cobyla\cobyla.c.obj 

в

$(C_DEFINES) /O1 /FoCMakeFiles\nlopt.dir\cobyla\cobyla.c.obj 

Затем запустите nmake, и он будет строить (при выдаче предупреждения cl : Command line warning D9025 : overriding '/O2' with '/O1', но это именно то, что мы хотели).