Ошибка компиляции eiffel c: ошибка LNK2001: неразрешенный внешний символ

Я пытаюсь познакомиться с языком Eiffel, поэтому я установил Eiffel Studio 18 и создал приложение Graphics. Ошибка компиляции с сообщением:

Preparing C compilation using already configured msc C compiler...
ERROR: Cannot start "nmake".ERROR: Cannot start "nmake".

В документации предполагается, что утилита espawn может отображать доступные наборы инструментов, однако, похоже, она дает сбой:

PS C:\Program Files\Eiffel Software\EiffelStudio 18.07 GPL\tools\spec\win64\bin> & "C:\Program Files\Eiffel Software\EiffelStudio 18.07 GPL\tools\spec\win64\bin\espawn.exe" -l
Eiffel Environment Command Spawn Utility - Version: 18.07
Copyright Eiffel Software 1985-2018. All Rights Reserved.

Available C/C++ compilers:


espawn: system execution failed.
Following is the set of recorded exceptions:

******************************** Thread exception *****************************
In thread           Root thread            0x0 (thread id)
*******************************************************************************
-------------------------------------------------------------------------------
Class / Object      Routine                Nature of exception           Effect
-------------------------------------------------------------------------------
APPLICATION         root's creation        Segmentation violation:
<000000000363C588>                         Operating system signal.      Exit
-------------------------------------------------------------------------------
APPLICATION         root's creation
<000000000363C588>                         Routine failure.              Exit
-------------------------------------------------------------------------------

К сожалению, я не смог найти ничего, связанного с инструментальной цепочкой, кроме этой утилиты espawn, поэтому я попытался запустить Eiffel Studio из командной строки разработки VS, надеясь, что она может неявно полагаться на некоторые переменные среды. Это действительно помогло, однако компиляция по-прежнему не выполняется с ошибкой компоновщика:

Preparing C compilation using already configured msc C compiler...
big_file_C28_c.c
eoption.c
big_file_E2_c.c
big_file_C26_c.c
big_file_C27_c.c
big_file_C30_c.c
big_file_C29_c.c
big_file_C31_c.c
eref.c
epoly.c
esize.c
big_file_C25_c.c
big_file_C24_c.c
big_file_C23_c.c
big_file_C22_c.c
big_file_C21_c.c
big_file_C20_c.c
big_file_C19_c.c
eplug.c
eskelet.c
enames.c
evisib.c
big_file_C18_c.c
big_file_C17_c.c
big_file_C16_c.c
big_file_C15_c.c
big_file_C13_c.c
big_file_C14_c.c
ececil.c
big_file_C12_c.c
einit.c
eparents.c
big_file_C11_c.c
big_file_C10_c.c
big_file_C9_c.c
big_file_C8_c.c
big_file_C7_c.c
big_file_C6_c.c
big_file_C5_c.c
big_file_C4_c.c
big_file_C3_c.c
big_file_C2_c.c
big_file_C1_c.c
Скопировано файлов:         1.
emain.c
Microsoft (R) Windows (R) Resource Compiler Version 10.0.10011.16384
Copyright (C) Microsoft Corporation.  All rights reserved.

Microsoft (R) Incremental Linker Version 14.16.27024.1
Copyright (C) Microsoft Corporation.  All rights reserved.

-STACK:5000000 -NODEFAULTLIB:libc -STACK:5000000 -NODEFAULTLIB:libc -SUBSYSTEM:WINDOWS -OUT:my_wel_application_1.exe 
e1\emain.obj 
"C:\Program Files\Eiffel Software\EiffelStudio 18.07 GPL\studio\spec\win64\lib\msc\finalized.lib" "C:\Program Files\Eiffel Software\EiffelStudio 18.07 GPL\library\wel\spec\msc\win64\lib\wel.lib" 
USER32.lib WS2_32.lib ADVAPI32.lib GDI32.lib SHELL32.lib MSIMG32.lib COMDLG32.lib UUID.lib OLE32.lib OLEAUT32.lib COMCTL32.lib MPR.LIB SHLWAPI.LIB WINSPOOL.LIB 
my_wel_application_1.res 
E2\Eobj2.lib E1\eparents.obj E1\einit.obj E1\ececil.obj E1\evisib.obj 
E1\enames.obj E1\eskelet.obj E1\eplug.obj E1\esize.obj E1\epoly.obj 
E1\eref.obj E1\eoption.obj C31\Cobj31.lib C30\Cobj30.lib C29\Cobj29.lib 
C28\Cobj28.lib C27\Cobj27.lib C26\Cobj26.lib C25\Cobj25.lib C24\Cobj24.lib 
C23\Cobj23.lib C22\Cobj22.lib C21\Cobj21.lib C20\Cobj20.lib C19\Cobj19.lib 
C18\Cobj18.lib C17\Cobj17.lib C16\Cobj16.lib C15\Cobj15.lib C14\Cobj14.lib 
C13\Cobj13.lib C12\Cobj12.lib C11\Cobj11.lib C10\Cobj10.lib C9\Cobj9.lib 
C8\Cobj8.lib C7\Cobj7.lib C6\Cobj6.lib C5\Cobj5.lib C4\Cobj4.lib 
C3\Cobj3.lib C2\Cobj2.lib C1\Cobj1.lib 
finalized.lib(econsole.obj) : error LNK2001: unresolved external symbol __iob_func
finalized.lib(console.obj) : error LNK2001: unresolved external symbol __iob_func
finalized.lib(file.obj) : error LNK2001: unresolved external symbol __iob_func
finalized.lib(main.obj) : error LNK2001: unresolved external symbol __iob_func
finalized.lib(except.obj) : error LNK2001: unresolved external symbol __iob_func
finalized.lib(sig.obj) : error LNK2001: unresolved external symbol __iob_func
finalized.lib(option.obj) : error LNK2001: unresolved external symbol __iob_func
finalized.lib(main.obj) : error LNK2019: unresolved external symbol _set_output_format referenced in function eif_rtinit
finalized.lib(run_idr.obj) : error LNK2001: unresolved external symbol sprintf
finalized.lib(except.obj) : error LNK2001: unresolved external symbol sprintf
finalized.lib(out.obj) : error LNK2001: unresolved external symbol sprintf
finalized.lib(file.obj) : error LNK2001: unresolved external symbol sprintf
finalized.lib(store.obj) : error LNK2001: unresolved external symbol sprintf
finalized.lib(econsole.obj) : error LNK2019: unresolved external symbol vfprintf referenced in function print_err_msg
finalized.lib(file.obj) : error LNK2019: unresolved external symbol fscanf referenced in function rt_swallow_nl
finalized.lib(retrieve.obj) : error LNK2019: unresolved external symbol sscanf referenced in function iread_header_new
finalized.lib(run_idr.obj) : error LNK2001: unresolved external symbol sscanf
my_wel_application_1.exe : fatal error LNK1120: 6 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64\link.EXE"' : return code '0x460'
Stop.

person user7860670    schedule 09.12.2018    source источник
comment
Очевидно, дело не в языке C.   -  person too honest for this site    schedule 09.12.2018
comment
Похоже, вам не хватает одной из сред выполнения Microsoft и, возможно, другой библиотеки. Открытый вопрос: почему? Я думаю, вам нужно выяснить, как получить подробный вывод от инструмента Eiffel, чтобы его можно было диагностировать в дальнейшем. В частности, как инструмент Eiffel вызывает link.exe.   -  person jww    schedule 09.12.2018
comment
@toohonestforthissite Речь идет о языке C. В частности, о настройке C toolchain для среды eiffel. Пожалуйста, воздержитесь от удаления тега C.   -  person user7860670    schedule 09.12.2018
comment
Тот факт, что задействованы файлы C, не означает, что речь идет о языке C , как указано в теге. Возможно, вы захотите прочитать стандарт, чтобы узнать, что из себя представляет язык C. Пожалуйста, воздержитесь от добавления несвязанных тегов к вопросам. Это в основном вопрос установки программного обеспечения.   -  person too honest for this site    schedule 09.12.2018
comment
Параметры компоновщика @jww перечислены в выходных данных компиляции, -NODEFAULTLIB:libc предполагает, что двоичный файл не должен быть связан с обычной средой выполнения c, а вместо этого связаны некоторые другие библиотеки, которые выглядят как среда выполнения (\lib\msc\finalized.lib и win64\lib\wel.lib). Однако странно, что -NODEFAULTLIB:libc указан дважды, в то время как неразрешенные символы явно взяты из стандартной библиотеки c.   -  person user7860670    schedule 09.12.2018
comment
Ошибка компоновщика @toohonestforthissite при компиляции кода C - не о языке C - в основном вопрос установки программного обеспечения - что это за логика?   -  person user7860670    schedule 09.12.2018
comment
Мне кажется необычным видеть библиотеки Linux в -NODEFAULTLIB:libc. Но я не знаком с Eiffel, функциями, которые он предоставляет, или процессом его сборки, поэтому мне, вероятно, следует отказаться от этого вопроса.   -  person jww    schedule 09.12.2018
comment
С каких это пор компоновщик компилирует < / b> язык?   -  person too honest for this site    schedule 09.12.2018


Ответы (1)


Ошибка компиляции при запуске из командной строки разработки VS связана с несоответствием между версией компилятора C и используемой библиотекой времени выполнения Eiffel. Установка соответствующей переменной среды перед запуском компиляции должна решить проблему:

    set ISE_C_COMPILER=msc_vc140

Что касается исходной ошибки, то по какой-то причине компиляция C не работает на некоторых машинах, потому что EiffelStudio не может найти VS. Проблема даже превратилась в FAQ.

person Alexander Kogtenkov    schedule 09.12.2018
comment
Это действительно помогло. Хотя пришлось начинать новый проект. Также я должен упомянуть, что страница часто задаваемых вопросов, на которую вы ссылаетесь, содержит неизданную документацию, в то время как ссылки справки на веб-сайте eiffel и IDE ведут на другую страницу без этого предложения и что существует правильный документация по обязательным переменным среды. - person user7860670; 09.12.2018