При компиляции конфигурационной библиотеки возникли ошибки логи содержат дополнительные детали

 Материалы
10 лет назад


Ошибки при компиляции

Перечень возможных ошибок при компиляции и как с ними бороться


        Иногда при компиляции могут возникнуть ошибки, из-за чего карта не скомпилируется. Список ошибок на карте (т.е. ваши ошибки) можно посмотреть, нажав в Хаммере Alt + P. Такие ошибки могут исправляться Хаммером автоматически при загрузке карты. Ошибки, которые Хаммер таким образом не исправил, не являются «опасными» для компиляторов, т.е. карта скомпилируется, даже если данная ошибка присутствует. Логические ошибки (т.е. ошибки, которые проявляются только в процессе компиляции) можно посмотреть в логе компилятора (.log-файл находится в папке с вашей картой и у него то же имя, что и у карты). Если была обнаружена логическая ошибка, карта не может быть скомпилирована или скомпилирована не всеми компиляторами. Вот список возможных ошибок

        1. There is no player start. Ошибка карты

Эту ошибку можно игнорировать

        2. Invalid texture «название текстуры». Ошибка карты

Один из брашей не имеет текстуры. Перейти к брашу можно по кнопке «Go to error» в окне исправления ошибок. Браш, вызвавший ошибку, будет абсолютно белым. Можно игнорировать, если потом добавите текстуру. В игре ошибочная текстура будет отображаться в виде эмо-сетки

        3. Texture axic perpendicular to face. Ошибка карты

Эта ошибка возникает по двум причинам:

        1. Если Вы вращали объект с выключенной опцией «Texture lock», и текстура стала перпендикулярна к стороне объекта;

        2. На карте есть объект неправильной формы, полученный в результате манипуляции с вертексами или при помощи функции Carve.

В обоих случаях проще удалить объект и создать новый.

        4. Invalid solid structure. Ошибка карты

Ошибка означает, что на карте есть браш неправильной формы, полученный в результате манипуляции с вертексами. Попытайтесь исправить данный объект или удалите и создайте новый.

        5. Solid entity «имя объекта» is empty. Ошибка карты

Ошибка означает, что брашевый энтити-объект не имеет формы (что он пустой). Трудно сказать из-за чего возникает данная ошибка, но было замечено, что иногда энтити-объект самостоятельно становится брашем, а редактор по-прежнему считает его энтити-объектом. И вот когда мы повторно превращаем браш в энтити-объект, возникает данная ошибка. Так что, скорее всего, это происходит из-за глюков самого редактора. В любом случае, лучше избавиться от таких ошибок, хоть они никак и не влияют на компиляцию.

А избавиться довольно легко. Нажмите [Alt-P], в появившемся окошке выделите строку «Solid entity … is empty» и нажмите кнопку «Go to error». Посмотрите на размер объекта (в статусной строке), если Вы видите что-то вроде: -1999998w, то нажмите Delete (т.е. просто удалите этот объект). Также поступите и с другими «пустыми» объектами.

Примечание: когда Вы перейдете к «пустому» объекту, то на карте его не будет видно, но редактор все же переходит к нему и позволяет удалить.

        6. Unmatched ‘target’ field «название». Ошибка карты

В параметре «Target» одного из объектов указано имя несуществующего объекта. Для исправления ошибки перейдите к объекту кнопкой «Go to error» и удалите/исправьте запись в параметре «Target», или же создайте объект с указанным там именем. Не влияет на компиляцию, но ошибочный объект может не сработать в игре

        7. Entity «имя объекта» has unused keyvalues. Ошибка карты

Указанная энтити содержит неиспользуемые параметры. Ошибка исправляется кнопкой «Fix». Не влияет на компиляцию, но в игре данный объект может не работать

        8. Entity «имя объекта» contains duplicate keyvalues. Ошибка карты

Указанный объект содержит несколько одинаковых параметров. Ошибка исправляется кнопкой «Fix». Также не влияет на компиляцию.

        10. Solid contains duplicate planes. Ошибка карты

Ошибка означает, что какой-то браш имеет две плоскости, наложенные друг на друга. Для исправления ошибки нажмите кнопку «Go to error», удалите объект и создайте новый.

        Это не весь список ошибок. Ещё есть логические ошибки, некоторые из них являются одновременно и ошибками карты. Но, я надеюсь, вы до них нескоро дойдёте.

        Хотя вам стоит познакомится с ошибкой Leak (утечка), грозой всех новичков. Ваша карта вся должна быть закрыта от чёрной пустоты обычными брашами (не энтити-брашами!). Если вдруг между этими брашами возникает зазор, какая-нибудь энтитя оказывается вне этой закрытой зоны или один из этих брашей является энтити-объектом, то возникает ошибка Leak. При этом компилятор VVIS не запустится, а в папке с картой появится файл «имя карты.lin», указывающий координаты лика (зазора). Карта, в принципе, скомпилируется, но она не будет делиться на листья и отрисовываться полностью, что очень сильно понизит FPS, если карта большая. Также не будет отображаться вода.

        Если вы так и не смогли найти лик, а вам нужно срочно скомпилировать карту VVIS’ом, то закройте всю вашу карту большой коробкой (создайте браш, выберите в контекстовом меню Make Hollow и введите, например, -32). Это разрешит проблему.

Если у вас возникла ошибка при компиляции, которая здесь не описана, и вы не знаете, ка её решить, вам сюда. А если знаете, то поделитесь знаниями — вам в любом случае сюда

Автор: Лорд Беккет Понравилось: 4  Не понравилось: 0 

Комментарии пользователей сайта:


Если Вам понравилась эта страница, Вы можете разместить где-нибудь ссылку на неё:

Народ. подскажите как струю воды вверх сделать, для фонтана надо

Даже экспериментировать необязательно, можно расчитать исходный вид, и от него указать градус

Samdog, поэкперементируй с Texture scale и Texture shift в покраске текстур

Что делать если майнкрафт текстуры в 2 раза больше и некоторые блоки перевернуты
?

задам прямо сюда, можно ли определить скорость игрока в определённой области (тригере)? если да, то как?

где здесь можно задать вопрос по маппингу?

да, инфы дофига, что не может не радовать)

Фига тут инфы куча :mrgreen:

я живой :ugeek:

Пусть остается таким какой он есть, не трогаешь, не ломается

Сайт уже давно на пенсии, тут надо радоваться что хотя бы он все еще работает как таковой! :ugeek:

Реально не хватает возможности редачить материалы, чтобы исправлять свои косяки, столько лет сайту, а до сих пор нет такой возможности

Или даже по возможности ответят

Просто лучший русскоязычный сайт по маппингу который только существует! Если что-то ищешь, всегда находишь находишь то, что нужно!

Можно ли как-нибудь глянуть список всех энтити которые присутствуют на карте?

:ugeek:

Barney, Вот краткий гайд на цикл https://prnt.sc/tw3ed9

Кто знает как сделать сирену(цикл)? :?:

:!:

Скорее всего это и есть туннель, и наверно этот туннель многополигональный, от этого и траблы на карте, плюс утечку желательно закрыть

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

Я не пользуюсь дискордом, только стим

CobuLight, дай свой дискорд

CobuLight, посмотри мой лог

CobuLight, У меня частая ошибка Trying to create a non-quad displacement! (entity 0, brush 3398) она в основном в брашах туннеля( у меня карта под метро 2033)

И скорее всего из-за расстояния тоже, но здесь я не хочу тыкать пальцем в небо, я не помню

Попробуй сократить количество брашей в func_detail, а если у тебя сложные браши, то сделай для них отдельные func_detail

у меня funl_detail много брашей на большем растоянии

Могу попробовать помочь, но только визуально, хотя давно не видел у себя этой проблемы…
Если так подумать, проблема может быть в переизбытке func_detail, либо ты слишком много брашей запилил в func_

4)Есть какая-то проблема с ареапорталами, ликами и т.д.

2)На карте слишком много маленьких простых брашей 3)Следует поработать над хинтами, чтобы помочь компилятору разбить карту на vis-листья эффективнее

Сорри,ничего конкретного сказать на эту тему не могу, могу лишь только предположить что 1)карта, пусть и оптимизированная, просто слишком большая и имеет множество зон

SpacetimeJunglist92, мой дискорд loeskee#6984
если сможешь помочь напиши

SpacetimeJunglist92, The map overflows the max portal count (43965 of max 32768)!

SpacetimeJunglist92, в основном нарушение лимитов по брашам, но когда делаю в func_detail,также пишет что привеш лимит.

Есть, кто живой? можете помочь с картой, а точнее с ошибками?

https://steamcommunity.com/sharedfiles/filedetails/?id=2052901697
Вот карта, также болььшиство моделей черные у игроков, хотя в вроде как вшивал их

Через часик попробую загрузить карту в мастерскую (удалил)

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

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

Такая проблема после компиляции карты, при запуске ее на пк все отражения норм всё как надо, но при загрузке в мастерскую и запуске ее оттуда все отражения на предметах яркие и совсем не те что нужны

Чтобы вращать и изменять размер через Ctrl+M (Rotate, Scale)

Пасаны, кто может подсказать как вращать и увеличивать декали? :?:

Кто может подсказать как из браша сделать проп. Префабы вроде как для этого, но я не понял где там в точечный энтити перевести. на карте перевес геометрии, не компилит, другого выхода нет.

Name_BY, к Вольво вопросы, нахерна они сломали и не фиксят уже сколько лет.

вопросик по cs:go. почему там не работает env_spritetrail? и можно это исправить?

Маппинг, картостроение, моделлинг в CS:Source и не только

Я дал необходимую переменную среды, которая приведена ниже, и я компилирую ее со следующим кодом:

./configure --prefix="/home/qemu/support_libs/libs/glib"

 export CFLAGS="-I`pwd`/../../support_libs/libs/gettext/include"

    export LIBFFI_CFLAGS="-I`pwd`/../../support_libs/libs/libffi/lib/libffi-3.0.13/include"

    export LIBFFI_LIBS="-L`pwd`/../../support_libs/libs/libffi/lib -lffi"

    export ZLIB_CFLAGS="-I`pwd`/../../support_libs/libs/zlib/include"

    export ZLIB_LIBS="-L`pwd`/../../support_libs/libs/zlib/lib -lz"

   export LD_LIBRARY_PATH="`pwd`/../../support_libs/libs/gettext/lib:`pwd`/../..    
/support_libs/libs/zlib/lib"

    LDFLAGS="-L`pwd`/../../support_libs/libs/gettext/lib"

Я позаботился о необходимой зависимости, но получаю эту ошибку

You must have either have gettext support in your C library, or use the
*** GNU gettext library. (http://www.gnu.org/software/gettext/gettext.htm

2 ответа

Лучший ответ

Все в порядке .. но двоичный файл, который ищет gettext (msgfmt), находится в каталоге bin файла gettext (gettext / bin). поэтому все, что нам нужно сделать, это добавить этот путь к корзине в переменную среды PATH.

После этого все работает нормально.


0

Ajay
31 Мар 2014 в 14:44

15 / 15 / 11

Регистрация: 07.02.2013

Сообщений: 168

1

Размещение библиотек при компиляции

23.08.2017, 13:25. Показов 3939. Ответов 14


Столкнулся с проблемой «срача» в папке debug при компиляции проекта.
В проекте использую библиотеки devexpress а так же свои библиотеки (wDb.dll, CorrectData.dll, Translator.dll). Добавлены они к проекту через references. При компиляции проекта все это добро порядка 30 файлов сваливается в папку debug.
Мне бы хотелось что бы:
мои библиотеки оказывались в папке …debugLibs
а библиотеки devexpress в папке …debugLibsLibDevs

Подскажите как это можно реализовать?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

OwenGlendower

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 13:55

2

Лучший ответ Сообщение было отмечено decoexire как решение

Решение

decoexire, 1) ставим Copy Local = False для этих зависимостей

2) Пишем post build скрипт создающий нужные подкаталоги и копирующий dll

3) В файл app.config добавляем секцию

XML
1
2
3
4
5
   <runtime>
       <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <probing privatePath="Libs; LibsLibDevs"/>
       </assemblyBinding>
   </runtime>

1

Эксперт .NET

11046 / 7603 / 1176

Регистрация: 21.01.2016

Сообщений: 28,600

23.08.2017, 13:57

3

decoexire,
0) Пытаемся понять нафига это надо и чем и кому библиотеки в одной папке мешаются

0

15 / 15 / 11

Регистрация: 07.02.2013

Сообщений: 168

23.08.2017, 14:02

 [ТС]

4

Цитата
Сообщение от OwenGlendower
Посмотреть сообщение

2) Пишем post build скрипт создающий нужные подкаталоги и копирующий dll

библиотеки там лежат зачем их копировать?

0

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 14:11

5

decoexire, в каталоге bin не должно лежать ничего без чего проект не компилируется хотя бы потому что многие системы контроля версий по умолчанию игнорируют каталоги bin, obj. То есть риск потерять их. Поэтому надежнее поместить библиотеки в папку решения (посмотри например как это делает NuGet), ставить ссылки на файлы из этот каталога и копировать файлы из него же. Чтобы не тратить время на копирование при каждой компиляции можно использовать xcopy с ключом /d

0

15 / 15 / 11

Регистрация: 07.02.2013

Сообщений: 168

23.08.2017, 14:22

 [ТС]

6

Цитата
Сообщение от OwenGlendower
Посмотреть сообщение

decoexire, в каталоге bin не должно лежать ничего без чего проект не компилируется хотя бы потому что многие системы контроля версий по умолчанию игнорируют каталоги bin, obj. То есть риск потерять их. Поэтому надежнее поместить библиотеки в папку решения (посмотри например как это делает NuGet), ставить ссылки на файлы из этот каталога и копировать файлы из него же. Чтобы не тратить время на копирование при каждой компиляции можно использовать xcopy с ключом /d

А можно пример?

0

OwenGlendower

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 14:45

7

decoexire,

Windows Batch file
1
2
mkdir "$(TargetDir)Libs"
xcopy /d /s "$(SolutionDir)Libs*.*" "$(TargetDir)Libs"

Скрипт ожидает что в папке с решением есть папка Libs с нужной структурой содержимое которого нужно целиком перенести в каталог Libs. Возможно стоит переносить только dll/pdb файлы, но это уже несложно сделать.

0

15 / 15 / 11

Регистрация: 07.02.2013

Сообщений: 168

23.08.2017, 15:03

 [ТС]

8

а запускать этот батник в program.cs?

0

293 / 233 / 58

Регистрация: 03.02.2011

Сообщений: 1,972

Записей в блоге: 1

23.08.2017, 15:07

9

Цитата
Сообщение от OwenGlendower
Посмотреть сообщение

Пишем post build

а как сама сборка при загрузке поймёт что либы лежат в какой то рядом лежащей папке, а не рядом с самой сборкой?
Через тот самый app.config при билде всё пропишется?

0

LeniumSoft

1452 / 845 / 150

Регистрация: 06.06.2012

Сообщений: 2,370

23.08.2017, 15:28

10

Цитата
Сообщение от skilllab
Посмотреть сообщение

Через тот самый app.config при билде всё пропишется?

XML
1
<probing privatePath="Libs; LibsLibDevs"/>

Вот мы уже написали две папки относительно exe файла.
Сборки будет искать рядом с exe и в этих папках.

0

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 15:29

11

Лучший ответ Сообщение было отмечено decoexire как решение

Решение

Цитата
Сообщение от decoexire
Посмотреть сообщение

а запускать этот батник в program.cs?

Нет. Эти команды для post build скрипта. Их нужно разместить в свойствах проекта, закладка Build Events, поле ввода «post build event command line».

Цитата
Сообщение от skilllab
Посмотреть сообщение

а как сама сборка при загрузке поймёт что либы лежат в какой то рядом лежащей папке, а не рядом с самой сборкой?

Элемент <probing privatePath="..." /> позволяет указать имена подкаталогов для поиска сборок. Если сборка не найдена в каталоге приложения, то поиск будет продолжен в указанных подкаталогах.

0

15 / 15 / 11

Регистрация: 07.02.2013

Сообщений: 168

23.08.2017, 16:06

 [ТС]

12

Цитата
Сообщение от OwenGlendower
Посмотреть сообщение

Нет. Эти команды для post build скрипта. Их нужно разместить в свойствах проекта, закладка Build Events, поле ввода «post build event command line».

Глупый конечно вопрос но, программирую на флешке , буквы разделов на разных ПК разные, как с этим быть? Например (I:Projectdebugliblib1.dll, I:Projectdebugliblib2.dll) а на другом пк это будет (Q:Projectdebugliblib1.dll, Q:Projectdebugliblib2.dll)

0

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 16:15

13

decoexire, это уже учтено благодаря использованию макросов $(TargetDir), $(SolutionDir). VS даст им правильные значения исходя из физического расположения проекта.

0

293 / 233 / 58

Регистрация: 03.02.2011

Сообщений: 1,972

Записей в блоге: 1

23.08.2017, 18:58

14

Интересная затея. А саттелиты так же действуют? Те что Ru-ru En-us

Добавлено через 50 секунд
Ну, типа прожект сам генерит нечто подобное в себе, чтоб потом обращаться как надо.

0

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 22:29

15

skilllab, не проверял, но думаю должны работать.

0

Когда я пытаюсь скомпилировать копию моего проекта на моем локальном компьютере, я получаю сообщение о том, что он пропускает несовместимые библиотеки. Это не тот случай, когда я возился с живой версией, размещенной на сервере на работе [она отлично работает].

Различные другие сайты заставили меня поверить, что это может быть проблемой среды, поскольку я разрабатываю 64-разрядный дистрибутив Ubuntu, и я предполагаю, что версия сервера работает на 32-разрядной версии. Тем не менее, после установки моих переменных окружения:

CFLAGS+=" -m32"
CXXFLAGS+=" -m32"

Я все равно получаю ту же ошибку компиляции:

/usr/bin/ld: skipping incompatible /dvlpmnt/libPI-Http.a when searching for -lPI-Http

Может ли учебник по обучению?

== Edit ==

Это был результат, который я получил после того, как я последовал совету Джонатана:

http.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

По всей видимости, библиотека, о которой идет речь, все равно 32-битная?

У меня огромное количество функций на общую сумму около 2.8 ГБ объектного кода (к сожалению, нет другого пути, научные вычисления …)

Когда я пытаюсь связать их, я получаю (ожидалось) relocation truncated to fit: R_X86_64_32S ошибки, которые я надеялся обойти, указав флаг компилятора -mcmodel=medium. Все библиотеки, которые связаны, кроме того, что я контролирую, скомпилированы с -fpic флаг.

Тем не менее, ошибка сохраняется, и я предполагаю, что некоторые библиотеки, на которые я ссылаюсь, не скомпилированы с помощью PIC.

Вот ошибка:

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x12): relocation truncated to fit: R_X86_64_32S against symbol `__libc_csu_fini'     defined in .text section in /usr/lib64/libc_nonshared.a(elf-init.oS)
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x19): relocation truncated to fit: R_X86_64_32S against symbol `__libc_csu_init'    defined in .text section in /usr/lib64/libc_nonshared.a(elf-init.oS)
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o: In function    `call_gmon_start':
(.text+0x7): relocation truncated to fit: R_X86_64_GOTPCREL against undefined symbol      `__gmon_start__'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbegin.o: In function `__do_global_dtors_aux':
crtstuff.c:(.text+0xb): relocation truncated to fit: R_X86_64_PC32 against `.bss' 
crtstuff.c:(.text+0x13): relocation truncated to fit: R_X86_64_32 against symbol `__DTOR_END__' defined in .dtors section in /usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtend.o
crtstuff.c:(.text+0x19): relocation truncated to fit: R_X86_64_32S against `.dtors'
crtstuff.c:(.text+0x28): relocation truncated to fit: R_X86_64_PC32 against `.bss'
crtstuff.c:(.text+0x38): relocation truncated to fit: R_X86_64_PC32 against `.bss'
crtstuff.c:(.text+0x3f): relocation truncated to fit: R_X86_64_32S against `.dtors'
crtstuff.c:(.text+0x46): relocation truncated to fit: R_X86_64_PC32 against `.bss'
crtstuff.c:(.text+0x51): additional relocation overflows omitted from the output
collect2: ld returned 1 exit status
make: *** [testsme] Error 1

И системные библиотеки, с которыми я связываюсь:

-lgfortran -lm -lrt -lpthread

Есть подсказки, где искать проблему?

EDIT:

Прежде всего, спасибо за обсуждение …

Чтобы немного прояснить, у меня есть сотни функций (каждая размером около 1 МБ в отдельных объектных файлах), например:

double func1(std::tr1::unordered_map<int, double> & csc, 
             std::vector<EvaluationNode::Ptr> & ti, 
             ProcessVars & s)
{
    double sum, prefactor, expr;

    prefactor = +s.ds8*s.ds10*ti[0]->value();
    expr =       ( - 5/243.*(s.x14*s.x15*csc[49300] + 9/10.*s.x14*s.x15*csc[49301] +
           1/10.*s.x14*s.x15*csc[49302] - 3/5.*s.x14*s.x15*csc[49303] -
           27/10.*s.x14*s.x15*csc[49304] + 12/5.*s.x14*s.x15*csc[49305] -
           3/10.*s.x14*s.x15*csc[49306] - 4/5.*s.x14*s.x15*csc[49307] +
           21/10.*s.x14*s.x15*csc[49308] + 1/10.*s.x14*s.x15*csc[49309] -
           s.x14*s.x15*csc[51370] - 9/10.*s.x14*s.x15*csc[51371] -
           1/10.*s.x14*s.x15*csc[51372] + 3/5.*s.x14*s.x15*csc[51373] +
           27/10.*s.x14*s.x15*csc[51374] - 12/5.*s.x14*s.x15*csc[51375] +
           3/10.*s.x14*s.x15*csc[51376] + 4/5.*s.x14*s.x15*csc[51377] -
           21/10.*s.x14*s.x15*csc[51378] - 1/10.*s.x14*s.x15*csc[51379] -
           2*s.x14*s.x15*csc[55100] - 9/5.*s.x14*s.x15*csc[55101] -
           1/5.*s.x14*s.x15*csc[55102] + 6/5.*s.x14*s.x15*csc[55103] +
           27/5.*s.x14*s.x15*csc[55104] - 24/5.*s.x14*s.x15*csc[55105] +
           3/5.*s.x14*s.x15*csc[55106] + 8/5.*s.x14*s.x15*csc[55107] -
           21/5.*s.x14*s.x15*csc[55108] - 1/5.*s.x14*s.x15*csc[55109] -
           2*s.x14*s.x15*csc[55170] - 9/5.*s.x14*s.x15*csc[55171] -
           1/5.*s.x14*s.x15*csc[55172] + 6/5.*s.x14*s.x15*csc[55173] +
           27/5.*s.x14*s.x15*csc[55174] - 24/5.*s.x14*s.x15*csc[55175] +
           // ...
           ;

        sum += prefactor*expr;
    // ...
    return sum;
}

Предмет s относительно невелик и сохраняет необходимые константы x14, x15, …, ds0, … и т. д., в то время как ti просто возвращает двойное значение из внешней библиотеки. Как вы видете, csc[] — это предварительно вычисленная карта значений, которая также оценивается в отдельных объектных файлах (опять же, в сотнях, размером около 1 МБ каждый) следующего вида:

void cscs132(std::tr1::unordered_map<int,double> & csc, ProcessVars & s)
{
    {
    double csc19295 =       + s.ds0*s.ds1*s.ds2 * ( -
           32*s.x12pow2*s.x15*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x15*s.x35*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x15*s.x35*s.x45*s.mWpowinv2 -
           32*s.x12pow2*s.x25*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x25*s.x35*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x25*s.x35*s.x45*s.mWpowinv2 +
           32*s.x12pow2*s.x34*s.mbpow4*s.mWpowinv2 +
           32*s.x12pow2*s.x34*s.x35*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x34*s.x45*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x35*s.mbpow4*s.mWpowinv2 +
           32*s.x12pow2*s.x35pow2*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x35pow2*s.x45*s.mWpowinv2 +
           64*s.x12pow2*s.x35*s.x45*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x35*s.x45pow2*s.mWpowinv2 -
           64*s.x12*s.p1p3*s.x15*s.mbpow4*s.mWpowinv2 +
           64*s.x12*s.p1p3*s.x15pow2*s.mbpow2*s.mWpowinv2 +
           96*s.x12*s.p1p3*s.x15*s.x25*s.mbpow2*s.mWpowinv2 -
           64*s.x12*s.p1p3*s.x15*s.x35*s.mbpow2*s.mWpowinv2 -
           64*s.x12*s.p1p3*s.x15*s.x45*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x25*s.mbpow4*s.mWpowinv2 +
           32*s.x12*s.p1p3*s.x25pow2*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x25*s.x35*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x25*s.x45*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x45*s.mbpow2 +
           64*s.x12*s.x14*s.x15pow2*s.x35*s.mWpowinv2 +
           96*s.x12*s.x14*s.x15*s.x25*s.x35*s.mWpowinv2 +
           32*s.x12*s.x14*s.x15*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.x14*s.x15*s.x35*s.mbpow2*s.mWpowinv2 -
           64*s.x12*s.x14*s.x15*s.x35pow2*s.mWpowinv2 -
           32*s.x12*s.x14*s.x15*s.x35*s.x45*s.mWpowinv2 +
           32*s.x12*s.x14*s.x25pow2*s.x35*s.mWpowinv2 +
           32*s.x12*s.x14*s.x25*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.x14*s.x25*s.x35pow2*s.mWpowinv2 -
           // ...
    
       csc.insert(cscMap::value_type(192953, csc19295));
    }

    {
       double csc19296 =      // ... ;

       csc.insert(cscMap::value_type(192956, csc19296));
    }

    // ...
}

Вот об этом. Последний шаг состоит в том, чтобы вызвать все эти func[i] и подведение итогов.

Что касается того, что это довольно особенный и необычный случай: да, это так. Это то, с чем приходится сталкиваться людям, пытаясь выполнить высокоточные вычисления для физики элементарных частиц.

EDIT2:

Я также должен добавить, что x12, x13 и т. Д. На самом деле не являются константами. Им присваиваются определенные значения, все эти функции запускаются и возвращается результат, а затем выбирается новый набор x12, x13 и т. Д. Для получения следующего значения. И это нужно сделать 105 в 106 раз …

EDIT3:

Спасибо за предложения и обсуждения до сих пор … Я попытаюсь как-нибудь свернуть циклы при генерации кода, не знаю, как именно это сделать, если честно, но это лучший выбор.

Кстати, я не пытался спрятаться за «это научные вычисления — нет способа оптимизировать».
Просто в основе этого кода лежит что-то, что происходит из «черного ящика», к которому у меня нет реального доступа, и, более того, все это отлично работает с простыми примерами, и я в основном чувствую себя подавленным тем, что происходит в реальной жизни. мировое приложение …

EDIT4:

Итак, мне удалось уменьшить размер кода csc определения примерно на одну четверть путем упрощения выражений в системе компьютерной алгебры (Mathematica). Теперь я также вижу способ уменьшить его на другой порядок или около того, применив некоторые другие уловки перед генерацией кода (что уменьшит размер этой части примерно до 100 МБ), и я надеюсь, что эта идея сработает.

Теперь что касается ваших ответов:

Я пытаюсь снова свернуть петли в funcs, где CAS не сильно поможет, но у меня уже есть некоторые идеи. Например, сортировка выражений по таким переменным, как x12, x13,..., проанализируйте cscs с помощью Python и сгенерируйте таблицы, которые связывают их друг с другом. Тогда я смогу хотя бы сгенерировать эти части в виде петель. Поскольку это пока что кажется лучшим решением, я отмечаю его как лучший ответ.

Однако я хотел бы также отдать должное VJo. GCC 4.6 действительно работает много лучше, производит меньший код и работает быстрее. Использование большой модели работает с кодом как есть. Так что технически это правильный ответ, но изменение всей концепции — гораздо лучший подход.

Спасибо всем за ваши предложения и помощь. Если кому-то интересно, я опубликую окончательный результат, как только буду готов.

ПРИМЕЧАНИЯ:

Просто несколько замечаний к другим ответам: код, который я пытаюсь запустить, не связан с расширением простых функций / алгоритмов и глупым ненужным развертыванием. На самом деле происходит то, что мы начинаем с довольно сложных математических объектов и приводим их к числовому виду. вычислимая форма генерирует эти выражения. Проблема на самом деле заключается в лежащей в основе физической теории. Сложность промежуточных выражений масштабируется факториально, что хорошо известно, но при объединении всего этого материала с чем-то физически измеримым — наблюдаемым — все сводится лишь к горстке очень маленьких функций, которые составляют основу выражений. (В этом отношении с общим и только доступный Ansatz который называется «теорией возмущений»). Мы пытаемся вывести этот анзац на другой уровень, который больше не реализуется аналитически и где неизвестен базис необходимых функций. Итак, мы пытаемся использовать его таким образом. Не лучший способ, но, надеюсь, тот, который, в конце концов, поможет нам понять физику …

ПОСЛЕДНИЙ РЕДАКТИРОВАНИЕ:

Благодаря всем вашим предложениям мне удалось значительно уменьшить размер кода, используя Mathematica и модификацию генератора кода для funcчто-то вроде верхнего ответа :)

Я упростил csc функционирует с Mathematica, уменьшив его до 92 МБ. Это неприводимая часть. Первые попытки заняли много времени, но после некоторой оптимизации теперь они выполняются примерно за 10 минут на одном процессоре.

Влияние на funcs был драматическим: общий размер кода для них уменьшился примерно до 9 МБ, поэтому теперь общий размер кода составляет 100 МБ. Теперь имеет смысл включить оптимизацию, и выполнение происходит довольно быстро.

Еще раз спасибо всем за ваши предложения, я многому научился.

Периодически на одном из тестовых стендов один отчет перестает работать.
При попытке его скомпилировать получаем исключение такого рода

Код: Выделить всё

Время: 2015-07-31 06:32:39.765
Категория: Exceptions
Тип: Error
An exception of type 'System.Exception' occurred and was caught.
----------------------------------------------------------------
Type : System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : c:WindowsTempdrbsw1bh.0.cs(1814,20) : error CS0103: Имя "Hour" отсутствует в текущем контексте
Source : Stimulsoft.Report
TargetSite : Void Compile(System.String, System.IO.Stream, Stimulsoft.Base.StiOutputType, Boolean, System.Object)
HResult : -2146233088
Stack Trace :    в Stimulsoft.Report.StiReport.Compile(String path, Stream stream, StiOutputType outputType, Boolean autoCreate, Object standaloneReportType)
   в Stimulsoft.Report.StiReport.Compile(String path, Stream stream, StiOutputType outputType, Boolean autoCreate)
   в Stimulsoft.Report.StiReport.Compile(String path, StiOutputType outputType, Boolean autoCreate)

«Hour» это имя вычисляемого поля (Calculated Column).
Код, вызывающий компиляцию:

Код: Выделить всё

            using (var report = new StiReport())
            {
                LoadFromDb(metadataId, report);
                _log.Write("Compiling report to {0}", fileName);
                var s = new Stopwatch();
                s.Start();
                report.Compile(fileName, StiOutputType.ClassLibrary);
                s.Stop();
                _log.Write("Report {0} compiled in {1} ms", metadataId, s.ElapsedMilliseconds);
            }

Отчеты хранятся в БД, как mrt файл в виде поля

Данный отчет в БД находится вроде бы в исправном состоянии — если подключиться к этой БД с другого компьютера, отчет нормально компилируется.
Прочие отчеты в это же время работают в этом же сайте.
Перезапуск проблемного сайта не помогает.
Помогает редеплоймент отчета в БД и перезапуск сайта, но все же на другой компьютер эта же БД отдает отчет в исправном состоянии.
Используемое ПО Reports.Web. 2015.1.11

Подскажите, куда копать?
Сейчас попробую обернуть вызов компиляции в try…catch, чтобы сбросить в лог текущий вид .mrt файла, как я его получил из БД

 Материалы
10 лет назад


Ошибки при компиляции

Перечень возможных ошибок при компиляции и как с ними бороться


        Иногда при компиляции могут возникнуть ошибки, из-за чего карта не скомпилируется. Список ошибок на карте (т.е. ваши ошибки) можно посмотреть, нажав в Хаммере Alt + P. Такие ошибки могут исправляться Хаммером автоматически при загрузке карты. Ошибки, которые Хаммер таким образом не исправил, не являются «опасными» для компиляторов, т.е. карта скомпилируется, даже если данная ошибка присутствует. Логические ошибки (т.е. ошибки, которые проявляются только в процессе компиляции) можно посмотреть в логе компилятора (.log-файл находится в папке с вашей картой и у него то же имя, что и у карты). Если была обнаружена логическая ошибка, карта не может быть скомпилирована или скомпилирована не всеми компиляторами. Вот список возможных ошибок

        1. There is no player start. Ошибка карты

Эту ошибку можно игнорировать

        2. Invalid texture «название текстуры». Ошибка карты

Один из брашей не имеет текстуры. Перейти к брашу можно по кнопке «Go to error» в окне исправления ошибок. Браш, вызвавший ошибку, будет абсолютно белым. Можно игнорировать, если потом добавите текстуру. В игре ошибочная текстура будет отображаться в виде эмо-сетки

        3. Texture axic perpendicular to face. Ошибка карты

Эта ошибка возникает по двум причинам:

        1. Если Вы вращали объект с выключенной опцией «Texture lock», и текстура стала перпендикулярна к стороне объекта;

        2. На карте есть объект неправильной формы, полученный в результате манипуляции с вертексами или при помощи функции Carve.

В обоих случаях проще удалить объект и создать новый.

        4. Invalid solid structure. Ошибка карты

Ошибка означает, что на карте есть браш неправильной формы, полученный в результате манипуляции с вертексами. Попытайтесь исправить данный объект или удалите и создайте новый.

        5. Solid entity «имя объекта» is empty. Ошибка карты

Ошибка означает, что брашевый энтити-объект не имеет формы (что он пустой). Трудно сказать из-за чего возникает данная ошибка, но было замечено, что иногда энтити-объект самостоятельно становится брашем, а редактор по-прежнему считает его энтити-объектом. И вот когда мы повторно превращаем браш в энтити-объект, возникает данная ошибка. Так что, скорее всего, это происходит из-за глюков самого редактора. В любом случае, лучше избавиться от таких ошибок, хоть они никак и не влияют на компиляцию.

А избавиться довольно легко. Нажмите [Alt-P], в появившемся окошке выделите строку «Solid entity … is empty» и нажмите кнопку «Go to error». Посмотрите на размер объекта (в статусной строке), если Вы видите что-то вроде: -1999998w, то нажмите Delete (т.е. просто удалите этот объект). Также поступите и с другими «пустыми» объектами.

Примечание: когда Вы перейдете к «пустому» объекту, то на карте его не будет видно, но редактор все же переходит к нему и позволяет удалить.

        6. Unmatched ‘target’ field «название». Ошибка карты

В параметре «Target» одного из объектов указано имя несуществующего объекта. Для исправления ошибки перейдите к объекту кнопкой «Go to error» и удалите/исправьте запись в параметре «Target», или же создайте объект с указанным там именем. Не влияет на компиляцию, но ошибочный объект может не сработать в игре

        7. Entity «имя объекта» has unused keyvalues. Ошибка карты

Указанная энтити содержит неиспользуемые параметры. Ошибка исправляется кнопкой «Fix». Не влияет на компиляцию, но в игре данный объект может не работать

        8. Entity «имя объекта» contains duplicate keyvalues. Ошибка карты

Указанный объект содержит несколько одинаковых параметров. Ошибка исправляется кнопкой «Fix». Также не влияет на компиляцию.

        10. Solid contains duplicate planes. Ошибка карты

Ошибка означает, что какой-то браш имеет две плоскости, наложенные друг на друга. Для исправления ошибки нажмите кнопку «Go to error», удалите объект и создайте новый.

        Это не весь список ошибок. Ещё есть логические ошибки, некоторые из них являются одновременно и ошибками карты. Но, я надеюсь, вы до них нескоро дойдёте.

        Хотя вам стоит познакомится с ошибкой Leak (утечка), грозой всех новичков. Ваша карта вся должна быть закрыта от чёрной пустоты обычными брашами (не энтити-брашами!). Если вдруг между этими брашами возникает зазор, какая-нибудь энтитя оказывается вне этой закрытой зоны или один из этих брашей является энтити-объектом, то возникает ошибка Leak. При этом компилятор VVIS не запустится, а в папке с картой появится файл «имя карты.lin», указывающий координаты лика (зазора). Карта, в принципе, скомпилируется, но она не будет делиться на листья и отрисовываться полностью, что очень сильно понизит FPS, если карта большая. Также не будет отображаться вода.

        Если вы так и не смогли найти лик, а вам нужно срочно скомпилировать карту VVIS’ом, то закройте всю вашу карту большой коробкой (создайте браш, выберите в контекстовом меню Make Hollow и введите, например, -32). Это разрешит проблему.

Если у вас возникла ошибка при компиляции, которая здесь не описана, и вы не знаете, ка её решить, вам сюда. А если знаете, то поделитесь знаниями — вам в любом случае сюда

Автор: Лорд Беккет Понравилось: 4  Не понравилось: 0 

Комментарии пользователей сайта:


Если Вам понравилась эта страница, Вы можете разместить где-нибудь ссылку на неё:

Народ. подскажите как струю воды вверх сделать, для фонтана надо

Даже экспериментировать необязательно, можно расчитать исходный вид, и от него указать градус

Samdog, поэкперементируй с Texture scale и Texture shift в покраске текстур

Что делать если майнкрафт текстуры в 2 раза больше и некоторые блоки перевернуты
?

задам прямо сюда, можно ли определить скорость игрока в определённой области (тригере)? если да, то как?

где здесь можно задать вопрос по маппингу?

да, инфы дофига, что не может не радовать)

Фига тут инфы куча :mrgreen:

я живой :ugeek:

Пусть остается таким какой он есть, не трогаешь, не ломается

Сайт уже давно на пенсии, тут надо радоваться что хотя бы он все еще работает как таковой! :ugeek:

Реально не хватает возможности редачить материалы, чтобы исправлять свои косяки, столько лет сайту, а до сих пор нет такой возможности

Или даже по возможности ответят

Просто лучший русскоязычный сайт по маппингу который только существует! Если что-то ищешь, всегда находишь находишь то, что нужно!

Можно ли как-нибудь глянуть список всех энтити которые присутствуют на карте?

:ugeek:

Barney, Вот краткий гайд на цикл https://prnt.sc/tw3ed9

Кто знает как сделать сирену(цикл)? :?:

:!:

Скорее всего это и есть туннель, и наверно этот туннель многополигональный, от этого и траблы на карте, плюс утечку желательно закрыть

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

Я не пользуюсь дискордом, только стим

CobuLight, дай свой дискорд

CobuLight, посмотри мой лог

CobuLight, У меня частая ошибка Trying to create a non-quad displacement! (entity 0, brush 3398) она в основном в брашах туннеля( у меня карта под метро 2033)

И скорее всего из-за расстояния тоже, но здесь я не хочу тыкать пальцем в небо, я не помню

Попробуй сократить количество брашей в func_detail, а если у тебя сложные браши, то сделай для них отдельные func_detail

у меня funl_detail много брашей на большем растоянии

Могу попробовать помочь, но только визуально, хотя давно не видел у себя этой проблемы…
Если так подумать, проблема может быть в переизбытке func_detail, либо ты слишком много брашей запилил в func_

4)Есть какая-то проблема с ареапорталами, ликами и т.д.

2)На карте слишком много маленьких простых брашей 3)Следует поработать над хинтами, чтобы помочь компилятору разбить карту на vis-листья эффективнее

Сорри,ничего конкретного сказать на эту тему не могу, могу лишь только предположить что 1)карта, пусть и оптимизированная, просто слишком большая и имеет множество зон

SpacetimeJunglist92, мой дискорд loeskee#6984
если сможешь помочь напиши

SpacetimeJunglist92, The map overflows the max portal count (43965 of max 32768)!

SpacetimeJunglist92, в основном нарушение лимитов по брашам, но когда делаю в func_detail,также пишет что привеш лимит.

Есть, кто живой? можете помочь с картой, а точнее с ошибками?

https://steamcommunity.com/sharedfiles/filedetails/?id=2052901697
Вот карта, также болььшиство моделей черные у игроков, хотя в вроде как вшивал их

Через часик попробую загрузить карту в мастерскую (удалил)

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

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

Такая проблема после компиляции карты, при запуске ее на пк все отражения норм всё как надо, но при загрузке в мастерскую и запуске ее оттуда все отражения на предметах яркие и совсем не те что нужны

Чтобы вращать и изменять размер через Ctrl+M (Rotate, Scale)

Пасаны, кто может подсказать как вращать и увеличивать декали? :?:

Кто может подсказать как из браша сделать проп. Префабы вроде как для этого, но я не понял где там в точечный энтити перевести. на карте перевес геометрии, не компилит, другого выхода нет.

Name_BY, к Вольво вопросы, нахерна они сломали и не фиксят уже сколько лет.

вопросик по cs:go. почему там не работает env_spritetrail? и можно это исправить?

Маппинг, картостроение, моделлинг в CS:Source и не только

Я дал необходимую переменную среды, которая приведена ниже, и я компилирую ее со следующим кодом:

./configure --prefix="/home/qemu/support_libs/libs/glib"

 export CFLAGS="-I`pwd`/../../support_libs/libs/gettext/include"

    export LIBFFI_CFLAGS="-I`pwd`/../../support_libs/libs/libffi/lib/libffi-3.0.13/include"

    export LIBFFI_LIBS="-L`pwd`/../../support_libs/libs/libffi/lib -lffi"

    export ZLIB_CFLAGS="-I`pwd`/../../support_libs/libs/zlib/include"

    export ZLIB_LIBS="-L`pwd`/../../support_libs/libs/zlib/lib -lz"

   export LD_LIBRARY_PATH="`pwd`/../../support_libs/libs/gettext/lib:`pwd`/../..    
/support_libs/libs/zlib/lib"

    LDFLAGS="-L`pwd`/../../support_libs/libs/gettext/lib"

Я позаботился о необходимой зависимости, но получаю эту ошибку

You must have either have gettext support in your C library, or use the
*** GNU gettext library. (http://www.gnu.org/software/gettext/gettext.htm

2 ответа

Лучший ответ

Все в порядке .. но двоичный файл, который ищет gettext (msgfmt), находится в каталоге bin файла gettext (gettext / bin). поэтому все, что нам нужно сделать, это добавить этот путь к корзине в переменную среды PATH.

После этого все работает нормально.


0

Ajay
31 Мар 2014 в 14:44

15 / 15 / 11

Регистрация: 07.02.2013

Сообщений: 168

1

Размещение библиотек при компиляции

23.08.2017, 13:25. Показов 3939. Ответов 14


Столкнулся с проблемой «срача» в папке debug при компиляции проекта.
В проекте использую библиотеки devexpress а так же свои библиотеки (wDb.dll, CorrectData.dll, Translator.dll). Добавлены они к проекту через references. При компиляции проекта все это добро порядка 30 файлов сваливается в папку debug.
Мне бы хотелось что бы:
мои библиотеки оказывались в папке …debugLibs
а библиотеки devexpress в папке …debugLibsLibDevs

Подскажите как это можно реализовать?

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

OwenGlendower

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 13:55

2

Лучший ответ Сообщение было отмечено decoexire как решение

Решение

decoexire, 1) ставим Copy Local = False для этих зависимостей

2) Пишем post build скрипт создающий нужные подкаталоги и копирующий dll

3) В файл app.config добавляем секцию

XML
1
2
3
4
5
   <runtime>
       <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
          <probing privatePath="Libs; LibsLibDevs"/>
       </assemblyBinding>
   </runtime>

1

Эксперт .NET

11046 / 7603 / 1176

Регистрация: 21.01.2016

Сообщений: 28,600

23.08.2017, 13:57

3

decoexire,
0) Пытаемся понять нафига это надо и чем и кому библиотеки в одной папке мешаются

0

15 / 15 / 11

Регистрация: 07.02.2013

Сообщений: 168

23.08.2017, 14:02

 [ТС]

4

Цитата
Сообщение от OwenGlendower
Посмотреть сообщение

2) Пишем post build скрипт создающий нужные подкаталоги и копирующий dll

библиотеки там лежат зачем их копировать?

0

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 14:11

5

decoexire, в каталоге bin не должно лежать ничего без чего проект не компилируется хотя бы потому что многие системы контроля версий по умолчанию игнорируют каталоги bin, obj. То есть риск потерять их. Поэтому надежнее поместить библиотеки в папку решения (посмотри например как это делает NuGet), ставить ссылки на файлы из этот каталога и копировать файлы из него же. Чтобы не тратить время на копирование при каждой компиляции можно использовать xcopy с ключом /d

0

15 / 15 / 11

Регистрация: 07.02.2013

Сообщений: 168

23.08.2017, 14:22

 [ТС]

6

Цитата
Сообщение от OwenGlendower
Посмотреть сообщение

decoexire, в каталоге bin не должно лежать ничего без чего проект не компилируется хотя бы потому что многие системы контроля версий по умолчанию игнорируют каталоги bin, obj. То есть риск потерять их. Поэтому надежнее поместить библиотеки в папку решения (посмотри например как это делает NuGet), ставить ссылки на файлы из этот каталога и копировать файлы из него же. Чтобы не тратить время на копирование при каждой компиляции можно использовать xcopy с ключом /d

А можно пример?

0

OwenGlendower

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 14:45

7

decoexire,

Windows Batch file
1
2
mkdir "$(TargetDir)Libs"
xcopy /d /s "$(SolutionDir)Libs*.*" "$(TargetDir)Libs"

Скрипт ожидает что в папке с решением есть папка Libs с нужной структурой содержимое которого нужно целиком перенести в каталог Libs. Возможно стоит переносить только dll/pdb файлы, но это уже несложно сделать.

0

15 / 15 / 11

Регистрация: 07.02.2013

Сообщений: 168

23.08.2017, 15:03

 [ТС]

8

а запускать этот батник в program.cs?

0

293 / 233 / 58

Регистрация: 03.02.2011

Сообщений: 1,972

Записей в блоге: 1

23.08.2017, 15:07

9

Цитата
Сообщение от OwenGlendower
Посмотреть сообщение

Пишем post build

а как сама сборка при загрузке поймёт что либы лежат в какой то рядом лежащей папке, а не рядом с самой сборкой?
Через тот самый app.config при билде всё пропишется?

0

LeniumSoft

1452 / 845 / 150

Регистрация: 06.06.2012

Сообщений: 2,370

23.08.2017, 15:28

10

Цитата
Сообщение от skilllab
Посмотреть сообщение

Через тот самый app.config при билде всё пропишется?

XML
1
<probing privatePath="Libs; LibsLibDevs"/>

Вот мы уже написали две папки относительно exe файла.
Сборки будет искать рядом с exe и в этих папках.

0

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 15:29

11

Лучший ответ Сообщение было отмечено decoexire как решение

Решение

Цитата
Сообщение от decoexire
Посмотреть сообщение

а запускать этот батник в program.cs?

Нет. Эти команды для post build скрипта. Их нужно разместить в свойствах проекта, закладка Build Events, поле ввода «post build event command line».

Цитата
Сообщение от skilllab
Посмотреть сообщение

а как сама сборка при загрузке поймёт что либы лежат в какой то рядом лежащей папке, а не рядом с самой сборкой?

Элемент <probing privatePath="..." /> позволяет указать имена подкаталогов для поиска сборок. Если сборка не найдена в каталоге приложения, то поиск будет продолжен в указанных подкаталогах.

0

15 / 15 / 11

Регистрация: 07.02.2013

Сообщений: 168

23.08.2017, 16:06

 [ТС]

12

Цитата
Сообщение от OwenGlendower
Посмотреть сообщение

Нет. Эти команды для post build скрипта. Их нужно разместить в свойствах проекта, закладка Build Events, поле ввода «post build event command line».

Глупый конечно вопрос но, программирую на флешке , буквы разделов на разных ПК разные, как с этим быть? Например (I:Projectdebugliblib1.dll, I:Projectdebugliblib2.dll) а на другом пк это будет (Q:Projectdebugliblib1.dll, Q:Projectdebugliblib2.dll)

0

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 16:15

13

decoexire, это уже учтено благодаря использованию макросов $(TargetDir), $(SolutionDir). VS даст им правильные значения исходя из физического расположения проекта.

0

293 / 233 / 58

Регистрация: 03.02.2011

Сообщений: 1,972

Записей в блоге: 1

23.08.2017, 18:58

14

Интересная затея. А саттелиты так же действуют? Те что Ru-ru En-us

Добавлено через 50 секунд
Ну, типа прожект сам генерит нечто подобное в себе, чтоб потом обращаться как надо.

0

Администратор

Эксперт .NET

15227 / 12266 / 4902

Регистрация: 17.03.2014

Сообщений: 24,867

Записей в блоге: 1

23.08.2017, 22:29

15

skilllab, не проверял, но думаю должны работать.

0

Когда я пытаюсь скомпилировать копию моего проекта на моем локальном компьютере, я получаю сообщение о том, что он пропускает несовместимые библиотеки. Это не тот случай, когда я возился с живой версией, размещенной на сервере на работе [она отлично работает].

Различные другие сайты заставили меня поверить, что это может быть проблемой среды, поскольку я разрабатываю 64-разрядный дистрибутив Ubuntu, и я предполагаю, что версия сервера работает на 32-разрядной версии. Тем не менее, после установки моих переменных окружения:

CFLAGS+=" -m32"
CXXFLAGS+=" -m32"

Я все равно получаю ту же ошибку компиляции:

/usr/bin/ld: skipping incompatible /dvlpmnt/libPI-Http.a when searching for -lPI-Http

Может ли учебник по обучению?

== Edit ==

Это был результат, который я получил после того, как я последовал совету Джонатана:

http.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped

По всей видимости, библиотека, о которой идет речь, все равно 32-битная?

У меня огромное количество функций на общую сумму около 2.8 ГБ объектного кода (к сожалению, нет другого пути, научные вычисления …)

Когда я пытаюсь связать их, я получаю (ожидалось) relocation truncated to fit: R_X86_64_32S ошибки, которые я надеялся обойти, указав флаг компилятора -mcmodel=medium. Все библиотеки, которые связаны, кроме того, что я контролирую, скомпилированы с -fpic флаг.

Тем не менее, ошибка сохраняется, и я предполагаю, что некоторые библиотеки, на которые я ссылаюсь, не скомпилированы с помощью PIC.

Вот ошибка:

/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x12): relocation truncated to fit: R_X86_64_32S against symbol `__libc_csu_fini'     defined in .text section in /usr/lib64/libc_nonshared.a(elf-init.oS)
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x19): relocation truncated to fit: R_X86_64_32S against symbol `__libc_csu_init'    defined in .text section in /usr/lib64/libc_nonshared.a(elf-init.oS)
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crti.o: In function    `call_gmon_start':
(.text+0x7): relocation truncated to fit: R_X86_64_GOTPCREL against undefined symbol      `__gmon_start__'
/usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtbegin.o: In function `__do_global_dtors_aux':
crtstuff.c:(.text+0xb): relocation truncated to fit: R_X86_64_PC32 against `.bss' 
crtstuff.c:(.text+0x13): relocation truncated to fit: R_X86_64_32 against symbol `__DTOR_END__' defined in .dtors section in /usr/lib/gcc/x86_64-redhat-linux/4.1.2/crtend.o
crtstuff.c:(.text+0x19): relocation truncated to fit: R_X86_64_32S against `.dtors'
crtstuff.c:(.text+0x28): relocation truncated to fit: R_X86_64_PC32 against `.bss'
crtstuff.c:(.text+0x38): relocation truncated to fit: R_X86_64_PC32 against `.bss'
crtstuff.c:(.text+0x3f): relocation truncated to fit: R_X86_64_32S against `.dtors'
crtstuff.c:(.text+0x46): relocation truncated to fit: R_X86_64_PC32 against `.bss'
crtstuff.c:(.text+0x51): additional relocation overflows omitted from the output
collect2: ld returned 1 exit status
make: *** [testsme] Error 1

И системные библиотеки, с которыми я связываюсь:

-lgfortran -lm -lrt -lpthread

Есть подсказки, где искать проблему?

EDIT:

Прежде всего, спасибо за обсуждение …

Чтобы немного прояснить, у меня есть сотни функций (каждая размером около 1 МБ в отдельных объектных файлах), например:

double func1(std::tr1::unordered_map<int, double> & csc, 
             std::vector<EvaluationNode::Ptr> & ti, 
             ProcessVars & s)
{
    double sum, prefactor, expr;

    prefactor = +s.ds8*s.ds10*ti[0]->value();
    expr =       ( - 5/243.*(s.x14*s.x15*csc[49300] + 9/10.*s.x14*s.x15*csc[49301] +
           1/10.*s.x14*s.x15*csc[49302] - 3/5.*s.x14*s.x15*csc[49303] -
           27/10.*s.x14*s.x15*csc[49304] + 12/5.*s.x14*s.x15*csc[49305] -
           3/10.*s.x14*s.x15*csc[49306] - 4/5.*s.x14*s.x15*csc[49307] +
           21/10.*s.x14*s.x15*csc[49308] + 1/10.*s.x14*s.x15*csc[49309] -
           s.x14*s.x15*csc[51370] - 9/10.*s.x14*s.x15*csc[51371] -
           1/10.*s.x14*s.x15*csc[51372] + 3/5.*s.x14*s.x15*csc[51373] +
           27/10.*s.x14*s.x15*csc[51374] - 12/5.*s.x14*s.x15*csc[51375] +
           3/10.*s.x14*s.x15*csc[51376] + 4/5.*s.x14*s.x15*csc[51377] -
           21/10.*s.x14*s.x15*csc[51378] - 1/10.*s.x14*s.x15*csc[51379] -
           2*s.x14*s.x15*csc[55100] - 9/5.*s.x14*s.x15*csc[55101] -
           1/5.*s.x14*s.x15*csc[55102] + 6/5.*s.x14*s.x15*csc[55103] +
           27/5.*s.x14*s.x15*csc[55104] - 24/5.*s.x14*s.x15*csc[55105] +
           3/5.*s.x14*s.x15*csc[55106] + 8/5.*s.x14*s.x15*csc[55107] -
           21/5.*s.x14*s.x15*csc[55108] - 1/5.*s.x14*s.x15*csc[55109] -
           2*s.x14*s.x15*csc[55170] - 9/5.*s.x14*s.x15*csc[55171] -
           1/5.*s.x14*s.x15*csc[55172] + 6/5.*s.x14*s.x15*csc[55173] +
           27/5.*s.x14*s.x15*csc[55174] - 24/5.*s.x14*s.x15*csc[55175] +
           // ...
           ;

        sum += prefactor*expr;
    // ...
    return sum;
}

Предмет s относительно невелик и сохраняет необходимые константы x14, x15, …, ds0, … и т. д., в то время как ti просто возвращает двойное значение из внешней библиотеки. Как вы видете, csc[] — это предварительно вычисленная карта значений, которая также оценивается в отдельных объектных файлах (опять же, в сотнях, размером около 1 МБ каждый) следующего вида:

void cscs132(std::tr1::unordered_map<int,double> & csc, ProcessVars & s)
{
    {
    double csc19295 =       + s.ds0*s.ds1*s.ds2 * ( -
           32*s.x12pow2*s.x15*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x15*s.x35*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x15*s.x35*s.x45*s.mWpowinv2 -
           32*s.x12pow2*s.x25*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x25*s.x35*s.mbpow2*s.mWpowinv2 -
           32*s.x12pow2*s.x25*s.x35*s.x45*s.mWpowinv2 +
           32*s.x12pow2*s.x34*s.mbpow4*s.mWpowinv2 +
           32*s.x12pow2*s.x34*s.x35*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x34*s.x45*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x35*s.mbpow4*s.mWpowinv2 +
           32*s.x12pow2*s.x35pow2*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x35pow2*s.x45*s.mWpowinv2 +
           64*s.x12pow2*s.x35*s.x45*s.mbpow2*s.mWpowinv2 +
           32*s.x12pow2*s.x35*s.x45pow2*s.mWpowinv2 -
           64*s.x12*s.p1p3*s.x15*s.mbpow4*s.mWpowinv2 +
           64*s.x12*s.p1p3*s.x15pow2*s.mbpow2*s.mWpowinv2 +
           96*s.x12*s.p1p3*s.x15*s.x25*s.mbpow2*s.mWpowinv2 -
           64*s.x12*s.p1p3*s.x15*s.x35*s.mbpow2*s.mWpowinv2 -
           64*s.x12*s.p1p3*s.x15*s.x45*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x25*s.mbpow4*s.mWpowinv2 +
           32*s.x12*s.p1p3*s.x25pow2*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x25*s.x35*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x25*s.x45*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.p1p3*s.x45*s.mbpow2 +
           64*s.x12*s.x14*s.x15pow2*s.x35*s.mWpowinv2 +
           96*s.x12*s.x14*s.x15*s.x25*s.x35*s.mWpowinv2 +
           32*s.x12*s.x14*s.x15*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.x14*s.x15*s.x35*s.mbpow2*s.mWpowinv2 -
           64*s.x12*s.x14*s.x15*s.x35pow2*s.mWpowinv2 -
           32*s.x12*s.x14*s.x15*s.x35*s.x45*s.mWpowinv2 +
           32*s.x12*s.x14*s.x25pow2*s.x35*s.mWpowinv2 +
           32*s.x12*s.x14*s.x25*s.x34*s.mbpow2*s.mWpowinv2 -
           32*s.x12*s.x14*s.x25*s.x35pow2*s.mWpowinv2 -
           // ...
    
       csc.insert(cscMap::value_type(192953, csc19295));
    }

    {
       double csc19296 =      // ... ;

       csc.insert(cscMap::value_type(192956, csc19296));
    }

    // ...
}

Вот об этом. Последний шаг состоит в том, чтобы вызвать все эти func[i] и подведение итогов.

Что касается того, что это довольно особенный и необычный случай: да, это так. Это то, с чем приходится сталкиваться людям, пытаясь выполнить высокоточные вычисления для физики элементарных частиц.

EDIT2:

Я также должен добавить, что x12, x13 и т. Д. На самом деле не являются константами. Им присваиваются определенные значения, все эти функции запускаются и возвращается результат, а затем выбирается новый набор x12, x13 и т. Д. Для получения следующего значения. И это нужно сделать 105 в 106 раз …

EDIT3:

Спасибо за предложения и обсуждения до сих пор … Я попытаюсь как-нибудь свернуть циклы при генерации кода, не знаю, как именно это сделать, если честно, но это лучший выбор.

Кстати, я не пытался спрятаться за «это научные вычисления — нет способа оптимизировать».
Просто в основе этого кода лежит что-то, что происходит из «черного ящика», к которому у меня нет реального доступа, и, более того, все это отлично работает с простыми примерами, и я в основном чувствую себя подавленным тем, что происходит в реальной жизни. мировое приложение …

EDIT4:

Итак, мне удалось уменьшить размер кода csc определения примерно на одну четверть путем упрощения выражений в системе компьютерной алгебры (Mathematica). Теперь я также вижу способ уменьшить его на другой порядок или около того, применив некоторые другие уловки перед генерацией кода (что уменьшит размер этой части примерно до 100 МБ), и я надеюсь, что эта идея сработает.

Теперь что касается ваших ответов:

Я пытаюсь снова свернуть петли в funcs, где CAS не сильно поможет, но у меня уже есть некоторые идеи. Например, сортировка выражений по таким переменным, как x12, x13,..., проанализируйте cscs с помощью Python и сгенерируйте таблицы, которые связывают их друг с другом. Тогда я смогу хотя бы сгенерировать эти части в виде петель. Поскольку это пока что кажется лучшим решением, я отмечаю его как лучший ответ.

Однако я хотел бы также отдать должное VJo. GCC 4.6 действительно работает много лучше, производит меньший код и работает быстрее. Использование большой модели работает с кодом как есть. Так что технически это правильный ответ, но изменение всей концепции — гораздо лучший подход.

Спасибо всем за ваши предложения и помощь. Если кому-то интересно, я опубликую окончательный результат, как только буду готов.

ПРИМЕЧАНИЯ:

Просто несколько замечаний к другим ответам: код, который я пытаюсь запустить, не связан с расширением простых функций / алгоритмов и глупым ненужным развертыванием. На самом деле происходит то, что мы начинаем с довольно сложных математических объектов и приводим их к числовому виду. вычислимая форма генерирует эти выражения. Проблема на самом деле заключается в лежащей в основе физической теории. Сложность промежуточных выражений масштабируется факториально, что хорошо известно, но при объединении всего этого материала с чем-то физически измеримым — наблюдаемым — все сводится лишь к горстке очень маленьких функций, которые составляют основу выражений. (В этом отношении с общим и только доступный Ansatz который называется «теорией возмущений»). Мы пытаемся вывести этот анзац на другой уровень, который больше не реализуется аналитически и где неизвестен базис необходимых функций. Итак, мы пытаемся использовать его таким образом. Не лучший способ, но, надеюсь, тот, который, в конце концов, поможет нам понять физику …

ПОСЛЕДНИЙ РЕДАКТИРОВАНИЕ:

Благодаря всем вашим предложениям мне удалось значительно уменьшить размер кода, используя Mathematica и модификацию генератора кода для funcчто-то вроде верхнего ответа

Я упростил csc функционирует с Mathematica, уменьшив его до 92 МБ. Это неприводимая часть. Первые попытки заняли много времени, но после некоторой оптимизации теперь они выполняются примерно за 10 минут на одном процессоре.

Влияние на funcs был драматическим: общий размер кода для них уменьшился примерно до 9 МБ, поэтому теперь общий размер кода составляет 100 МБ. Теперь имеет смысл включить оптимизацию, и выполнение происходит довольно быстро.

Еще раз спасибо всем за ваши предложения, я многому научился.

Периодически на одном из тестовых стендов один отчет перестает работать.
При попытке его скомпилировать получаем исключение такого рода

Код: Выделить всё

Время: 2015-07-31 06:32:39.765
Категория: Exceptions
Тип: Error
An exception of type 'System.Exception' occurred and was caught.
----------------------------------------------------------------
Type : System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : c:WindowsTempdrbsw1bh.0.cs(1814,20) : error CS0103: Имя "Hour" отсутствует в текущем контексте
Source : Stimulsoft.Report
TargetSite : Void Compile(System.String, System.IO.Stream, Stimulsoft.Base.StiOutputType, Boolean, System.Object)
HResult : -2146233088
Stack Trace :    в Stimulsoft.Report.StiReport.Compile(String path, Stream stream, StiOutputType outputType, Boolean autoCreate, Object standaloneReportType)
   в Stimulsoft.Report.StiReport.Compile(String path, Stream stream, StiOutputType outputType, Boolean autoCreate)
   в Stimulsoft.Report.StiReport.Compile(String path, StiOutputType outputType, Boolean autoCreate)

«Hour» это имя вычисляемого поля (Calculated Column).
Код, вызывающий компиляцию:

Код: Выделить всё

            using (var report = new StiReport())
            {
                LoadFromDb(metadataId, report);
                _log.Write("Compiling report to {0}", fileName);
                var s = new Stopwatch();
                s.Start();
                report.Compile(fileName, StiOutputType.ClassLibrary);
                s.Stop();
                _log.Write("Report {0} compiled in {1} ms", metadataId, s.ElapsedMilliseconds);
            }

Отчеты хранятся в БД, как mrt файл в виде поля

Данный отчет в БД находится вроде бы в исправном состоянии — если подключиться к этой БД с другого компьютера, отчет нормально компилируется.
Прочие отчеты в это же время работают в этом же сайте.
Перезапуск проблемного сайта не помогает.
Помогает редеплоймент отчета в БД и перезапуск сайта, но все же на другой компьютер эта же БД отдает отчет в исправном состоянии.
Используемое ПО Reports.Web. 2015.1.11

Подскажите, куда копать?
Сейчас попробую обернуть вызов компиляции в try…catch, чтобы сбросить в лог текущий вид .mrt файла, как я его получил из БД

Это ваша первая программа на C (или C++) — она не такая уж большая, и вы собираетесь скомпилировать ее. Вы нажимаете на compile (или вводите команду компиляции) и ждете. Ваш компилятор выдает пятьдесят строк текста. Вы выбираете слова warning и error. Задумываетесь, значит ли это, что все в порядке. Вы ищите полученный исполняемый файл. Ничего. Черт возьми, думаете вы, я должен выяснить, что все это значит …

Типы ошибок компиляции

Во-первых, давайте различать типы ошибок. Большинство компиляторов покажет три типа предупреждений во время компиляции:

  • предупреждения компилятора;
  • ошибки компилятора;
  • ошибки компоновщика.

Хоть вы и не хотите игнорировать их, предупреждения компилятора не являются чем-то достаточно серьезным, чтобы не скомпилировать вашу программу. Прочитайте следующую статью, которая расскажет вам, почему стоит дружить с компилятором и его предупреждениями. Как правило, предупреждения компилятора — это признак того, что что-то может пойти не так во время выполнения. Как компилятор узнает об этом? Вы, должно быть делали типичные ошибки, о которых компилятор знает. Типичный пример — использование оператора присваивания = вместо оператора равенства == внутри выражения. Ваш компилятор также может предупредить вас об использовании переменных, которые не были инициализированы и других подобных ошибках. Как правило, вы можете установить уровень предупреждений вашего компилятора — я устанавливаю его на самый высокий уровень, так что предупреждения компилятора не превращаются в ошибки в выполняемой программе (“ошибки выполнения”).

Тем не менее, предупреждения компилятора не должны останавливать работу вашей программы (если только вы не укажете компилятору рассматривать предупреждения как ошибки), так что они, вероятно, не так серьезны как ошибки.

Ошибки — это условия, которые препятствуют завершению компиляции ваших файлов.

Ошибки компилятора ограничены отдельными файлами исходного кода и являются результатом “синтаксических ошибок”. На самом деле, это означает, что вы сделали что-то, что компилятор не может понять. Например, выражение for(;) синтаксически не правильно, потому что цикл всегда должен иметь три части. Хотя компилятор ожидал точку с запятой, он мог также ожидать условное выражение, поэтому сообщение об ошибке, которое вы получите может быть что-то вроде:

line 13, unexpected parenthesis ‘)’

Заметьте, что ошибки компилятора всегда будут включать номер строки, в которой была обнаружена ошибка.

Даже если вы прошли процесс компиляции успешно, вы можете столкнуться с ошибками компоновщика. Ошибки компоновщика, в отличие от ошибок компилятора, не имеют ничего общего с неправильным синтаксисом. Вместо этого, ошибки компоновщика — это, как правило, проблемы с поиском определения функций, структур, классов или глобальных переменных, которые были объявлены, но не определены, в файле исходного кода. Как правило, эти ошибки будут иметь вид:

could not find definition for X

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

Ошибки компилятора — с чего начать?

Если вы столкнулись с перечнем пятидесяти или шестидесяти ошибок и предупреждений, то будет сложно определить с чего начать. Самое лучшее место, тем не менее, в начале списка. В самом деле, вы почти никогда не начинаете исправлять ошибки от конца файла до его начала по одной простой причине: вы не знаете ошибки ли они на самом деле!

Одна ошибка в верхней части вашей программы может вызвать целый ряд других ошибок компилятора, потому что эти строки могут рассчитывать на что-то в начале программы, что компилятор не смог понять. Например, если вы объявляете переменную с неправильным синтаксисом, компилятор сообщит о синтаксических ошибках, и что он не может найти объявление для переменной. Точка с запятой, поставленные не в том месте, могут привести к огромному количеству ошибок. Это происходит, потому что синтаксис C и C++ синтаксис позволяет объявить тип сразу же после его определения:

struct 
{
   int x;
   int y;
} myStruct;

код создаст переменную, MyStruct, с местом для хранения структуры, содержащей два целых числа. К сожалению, это означает, что если вы опустите точку с запятой, компилятор будет интерпретировать это так, как будто следующая вещь в программе будет структурой (или возвращает структуру).

Что-то вроде этого:

struct MyStructType
{
   int x;
   int y;
}

int foo()
{}

может привести к огромному количеству ошибок, возможно, включая сообщения:

extraneous ‘int’ ignored

Все это из-за одного символа! Лучше всего начать с самого верха.

 Анализ сообщения об ошибке

Большинство сообщений от компилятора будет состоять как минимум из четырех вещей:

  1. тип сообщения — предупреждение или ошибка;
  2. исходный файл, в котором появилась ошибка;
  3. строка ошибки;
  4. краткое описание того, что работает неправильно.

Вывод g++ для указанной выше программы может выглядеть следующим образом (ваши результаты могут отличаться, если вы используете другой компилятор):

foo.cc:7: error: semicolon missing after struct declaration

foo.cc это имя файла. 7 — номер строки, и ясно, что это ошибка. Короткое сообщение здесь весьма полезно, поскольку оно показывает именно то, что не правильно. Заметим, однако, что сообщение имеет смысл только в контексте программы. Оно не сообщает, в какой структуре не хватает запятой.

Более непонятным является другое сообщение об ошибке из той же попытки компиляции:

extraneous ‘int’ ignored

Программист должен выяснить, почему это произошло. Обратите внимание еще раз, что эта ошибка была вызвана проблемой в начале программы, не в строке 8, а раньше, когда в структуре не хватает точки с запятой. К счастью, понятно, что определение функции для foo было в порядке, это говорит нам о том, что ошибка должна быть где-то в другом месте программы. На самом деле, она должна быть в программе раньше — вы не будете получать сообщение об ошибке, которое указывает на синтаксическую ошибку до строки, на которой ошибка на самом деле произошла.

Это руководящий принцип вычисления ошибок компилятора: если сомневаетесь, посмотрите в программе раньше. Так как синтаксические ошибки могут позже иметь серьезные последствия, вполне возможно, что компилятор указывал номер строки, в которой на самом деле не было синтаксической ошибки!

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

Обработка непонятных или странных сообщений

Есть несколько особенно сложных типов ошибок компилятора. Первый — это необъявленная переменная, которую, как вам кажется, вы объявили. Часто, вы можете указать, где именно переменная была объявлена! Проблема в том, что часто переменная просто написана с ошибкой. К сожалению, это довольно трудно увидеть, так как обычно мы читаем то, что ожидаем, а не то, что есть на самом деле. Кроме того, есть и другие причины, почему это может быть проблемой — например, проблемы с видимостью!

Чтобы разобраться в возможных проблемах, я делаю так: в строке, где находится якобы необъявленная переменная, надо выполнить поиск текстовым редактором слова под курсором (в качестве альтернативы можно скопировать имя переменной и выполнить поиск), и если я записал его неправильно, оно не найдется. Также не надо вводить имя переменной вручную, так как вы случайно можете ввести его правильно.

Второе непонятное сообщение:

unexpected end of file

Что происходит? Почему конец файла будет «неожиданным» ? Ну, здесь главное думать как компилятор; если конец файла является неожиданным, то он,  должно быть, чего-то ждет. Что бы это могло быть? Ответ, как правило, «завершение». Например, закрывающие фигурные скобки или закрывающие кавычки. Хороший текстовый редактор, который выполняет подсветку синтаксиса и автоматический отступ, должен помочь исправить некоторые из этих ошибок, что позволяет легче обнаружить проблемы при написании кода.

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

Наконец, если ничего не работает, вы всегда можете просто переписать несколько строк кода, чтобы убрать любые скрытые синтаксические ошибки, которые вы могли не увидеть. Это может быть опасно, так как вы можете переписать не ту секцию, но это может помочь.

Ошибки компоновщика

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

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

undefined function

Обратите внимание на поддержку этих функций компилятором (это может произойти, если вы включите собственное объявление функции, чтобы обойти ошибку во время компиляции). Если ваш компилятор поддерживает эту функцию, то для решения проблемы обычно требуются конкретные настройки компилятора. Вам следует сообщить компилятору, где искать библиотеки и убедиться, что библиотеки были установлены правильно.

Ошибки компоновщика могут произойти в функциях, которые вы объявили и определили, если вы не включили все необходимые объектные файлы в процесс связывания. Например, если вы пишете определение класса в myClass.cpp, а ваша основная функция в myMain.cpp, компилятор создаст два объектных файла, myClass.o и myMain.o, а компоновщику будут нужны оба из них для завершения создания новой программы. Если оставить myClass.o, то у него не будет определения класса, даже если вы правильно включите myClass.h!

Иногда появляются незначительные ошибки, когда компоновщик сообщает о более чем одном определении для класса, функции или переменной. Эта проблема может появиться по нескольким причинам: во-первых, у объекта может быть два определения — например, две глобальные переменные объявлены как внешние переменные, чтобы быть доступными за пределами файла исходного кода. Это относится как к функциям, так и к переменным, и это, на самом деле, нередко случается. С другой стороны, иногда это проблема с директивами компоновщика; несколько раз я видел, как люди включают несколько копий одного и того же объектного файла в процесс связывания. И бинго, у вас есть несколько определений. Типичным проявлением этой проблемы является то, что у целого ряда функций есть несколько определений.

Последний странный тип ошибки компоновщика — сообщение

undefined reference to main

Данная ошибка компоновщика отличается от других тем, что она может не иметь ничего общего с объектом, включая файлы или правильные пути к вашей библиотеке. Напротив, это означает, что компоновщик пытался создать исполняемый файл и не смог понять, где расположена функция main(). Это может случиться, если вы забыли включить основную функцию, или, если вы попытаетесь скомпилировать код, который никогда не был отдельным исполняемым файлом (например, если вы попытались скомпилировать библиотеку).

При попытке скомпилировать проект в Maven (правая панель, пункт compile) вылазят ошибки:

/usr/lib/jvm/oracle_jdk1.8.0_92/bin/java -Dmaven.home=/home/rostislav/IDEs/IDEA/plugins/maven/lib/maven3 -Dclassworlds.conf=/home/rostislav/IDEs/IDEA/plugins/maven/lib/maven3/bin/m2.conf -Didea.launcher.port=7533 -Didea.launcher.bin.path=/home/rostislav/IDEs/IDEA/bin -Dfile.encoding=UTF-8 -classpath /home/rostislav/IDEs/IDEA/plugins/maven/lib/maven3/boot/plexus-classworlds-2.4.jar:/home/rostislav/IDEs/IDEA/lib/idea_rt.jar com.intellij.rt.execution.application.AppMain org.codehaus.classworlds.Launcher -Didea.version=2016.1.3 compile
[INFO] Scanning for projects...
[WARNING] 
[WARNING] Some problems were encountered while building the effective model for com.dugin.rostislav:OSLoaderServer:jar:1.0
[WARNING] 'build.plugins.plugin.version' for org.apache.maven.plugins:maven-compiler-plugin is missing. @ line 13, column 21
[WARNING] 
[WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
[WARNING] 
[WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
[WARNING] 
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building OSLoaderServer 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ OSLoaderServer ---
[debug] execute contextualize
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 0 resource
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ OSLoaderServer ---
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 22 source files to /home/rostislav/Projects/OSLoader/OSLoaderServer/target/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[38,29] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[39,27] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[40,25] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[41,27] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[42,20] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[43,18] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageChanger.java:[20,13] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[78,45] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[123,96] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[153,58] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[154,65] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[155,58] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[169,88] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[164,86] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[165,86] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[195,86] error: cannot find symbol
[ERROR]  variable image of type Image
/home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[196,92] error: cannot find symbol
[INFO] 17 errors 
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.229s
[INFO] Finished at: Fri Jul 29 02:04:36 MSK 2016
[INFO] Final Memory: 14M/137M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project OSLoaderServer: Compilation failure: Compilation failure:
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[38,29] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[39,27] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[40,25] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[41,27] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[42,20] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/database/sqlite/ImageRecord.java:[43,18] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageChanger.java:[20,13] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[78,45] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[123,96] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[153,58] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[154,65] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[155,58] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[169,88] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[164,86] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[165,86] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[195,86] error: cannot find symbol
[ERROR] variable image of type Image
[ERROR] /home/rostislav/Projects/OSLoader/OSLoaderServer/src/main/java/com/dugin/rostislav/image/work/model/ImageCreater.java:[196,92] error: cannot find symbol
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

По факту, ошибки указывают на участки кода, где ошибок нет… Сборка через Build -> Make Project работает хорошо (если исключить то, что не подтягиваются зависимости).


Удалять .m2 и перезапускать компиляцию пробовал — не помогло.


Как исправить эту ошибку и из-за чего она возникла?


UPD_0: класс ImageRecord (используется библиотека Lombok, которая создает геттеры и сеттеры, а так же ORM):

import com.dugin.rostislav.object.Image;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.misc.BaseDaoEnabled;
import com.j256.ormlite.table.DatabaseTable;
import lombok.Getter;
import lombok.Setter;

import static com.dugin.rostislav.image.ImagesConst.*;

@DatabaseTable(tableName = TABLE_NAME)
class ImageRecord extends BaseDaoEnabled {
    @Getter @Setter
    @DatabaseField(columnName = COLUMN_IMAGE_EMULATOR_TYPE)
    private Image.ImageEmulator imageEmulator;
    @Getter @Setter
    @DatabaseField(columnName = COLUMN_IMAGE_OS_TYPE)
    private Image.ImageOSType imageOSType;
    @Getter @Setter
    @DatabaseField(columnName = COLUMN_IMAGE_TYPE)
    private Image.ImageType imageType;
    @Getter @Setter
    @DatabaseField(columnName = COLUMN_DESCRIPTION)
    private String description;
    @Getter @Setter
    @DatabaseField(columnName = COLUMN_NAME)
    private String name;
    @Getter @Setter
    @DatabaseField(generatedId = true)
    private int id; //Auto generated DB column

    public ImageRecord() {
        //Void
    }

    ImageRecord(Image image) {
        imageEmulator = image.getImageEmulator();
        imageOSType = image.getImageOsType();
        imageType = image.getImageType();
        description = image.getDescription();
        name = image.getName();
        id = image.getId();
    }

    public Image toImage() {
        return Image.builder()
                .setImageType(imageType)
                .setImageEmulator(imageEmulator)
                .setImageOsType(imageOSType)
                .setDescription(description)
                .setName(name)
                .setId(id)
                .build();
    }
}

UPD_1: класс Image:

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.io.Serializable;

@ToString
public class Image implements Serializable {
    public static class Builder implements Serializable {
        private ImageEmulator imageEmulator;
        private ImageOSType imageOsType;
        private ImageType imageType;
        private String name;
        private String path;
        private String description;
        private int id;

        private Builder() {
            //private constructor
        }

        public Builder setImageEmulator(ImageEmulator imageEmulator) {
            if (imageType == null) {
                throw new RuntimeException("Firstly, set image type");
            }

            if ((imageEmulator != null) && (imageType == ImageType.IMAGE_ISO)) {
                throw new RuntimeException("Only OS and BIOS images has definite emulator");
            }

            this.imageEmulator = imageEmulator;
            return this;
        }

        public Builder setImageOsType(ImageOSType imageOsType) {
            if (imageType == null) {
                throw new RuntimeException("Firstly, set image type");
            }

            if ((imageOsType != null) && (imageType != ImageType.IMAGE_OS)) {
                throw new RuntimeException("Only OS images has definite OS type");
            }

            this.imageOsType = imageOsType;
            return this;
        }

        public Builder setImageType(ImageType imageType) {
            this.imageType = imageType;
            return this;
        }

        public Builder setName(String name) {
            this.name = name;
            return this;
        }

        public Builder setPath(String path) {
            this.path = path;
            return this;
        }

        public Builder setDescription(String description) {
            this.description = description;
            return this;
        }

        public Builder setId(int id) {
            this.id = id;
            return this;
        }

        public Image build() {
            return new Image(this);
        }
    }

    public enum ImageType {IMAGE_OS, IMAGE_BIOS, IMAGE_ISO}
    public enum ImageEmulator {QEMU, BOCHS}
    public enum ImageOSType {WINDOWS, LINUX, OTHER}

    @Getter private ImageEmulator imageEmulator;
    @Getter private ImageOSType imageOsType;
    @Getter private ImageType imageType;
    @Getter private String name;
    @Getter private String path;
    @Getter private String description;
    @Getter @Setter private int id;

    private Image(Builder builder) {
        imageEmulator = builder.imageEmulator;
        imageOsType = builder.imageOsType;
        imageType = builder.imageType;
        name = builder.name;
        path = builder.path;
        description = builder.description;
        id = builder.id;
    }

    public static Builder builder() {
        return new Builder();
    }
}

UPD_3: фото из настроек IDEA:

введите сюда описание изображения
введите сюда описание изображения

Навигация: Главная страница/Система ejudge/Использование/Вердикты тестирования/Ошибка компиляции

Английское название: Compilation Error, CE

Если у посылки установлен такой статус, при компиляции программы возникла ошибка компиляции. Причины возникновения ошибки компиляции зависят от используемого компилятора. Судейский протокол тестирования для посылок с таким статусом содержит полный вывод (на стандартный поток вывода и стандартный поток ошибок) компилятора. Если глобальная конфигурационная переменная
team_enable_rep_view или конфигурационная переменная раздела описания задачи team_enable_rep_view файла конфигурации турнира serve.cfg установлена
в true, то диагностика компилятора становиться доступной участнику турнира.

Кроме того, если установлена глобальная конфигурационная переменная
team_enable_ce_view или конфигурационная переменная раздела описания задачи team_enable_ce_view файла конфигурации турнира serve.cfg
установлена в true, диагностика компилятора в случае ошибки компиляции предоставляется участнику вне зависимости от значения конфигурационной переменной
team_enable_rep_view.

Если установлена глобальная конфигурационная переменная ignore_compile_errors
файла конфигурации турнира serve.cfg, то посылки, имеющие данный статус, не
учитываются при вычислении текущих результатов турнира, штрафов за предыдущие
посылки участника, набранного количества баллов и т. д.

Вы видите результат, сгенерированный макросом __FILE__ внутри компилятора MSVC. Дисковод F: был дисководом, используемым на машине сборки в Редмонде для хранения исходного кода. dd означает DevDiv, подразделение подразделения Servers and Tools Microsoft, которое отвечает за продукты разработчика, такие как MSVC. p0 в имени файла дает подсказку, в которой произошел сбой компилятора, p0 — препроцессорный проход. Поэтому может возникнуть какая-то проблема с макросами. Хотя io подсказывает проблемы с файлом.

Нет кода для просмотра, поэтому я могу только рекомендовать документированное обходное решение для C1073. Отключите инкрементную компиляцию с помощью Project + Properties, C/С++, General, Debug Information Format. Измените его по умолчанию /ZI на/Zi и перестройте свой проект. Удалите любой файл .pch в каталоге сборки вручную, чтобы быть уверенным. Надеемся, вы теперь получите сообщения об ошибках, которые подскажут, почему ваш код заставил компилятор пойти на нос. Исправьте те, и с некоторой удачей вы можете снова включить /ZI.

Если у вас все еще есть проблемы, и вы воспроизводите эту проблему с помощью VS2012, вы можете подать отчет об ошибке на странице connect.microsoft.com. Им понадобится копия вашего проекта, чтобы воспроизвести проблему. Если вы не можете ждать или использовать старую версию, обратитесь в службу поддержки Microsoft.

Это ваша первая программа на C (или C++) — она не такая уж большая, и вы собираетесь скомпилировать ее. Вы нажимаете на compile (или вводите команду компиляции) и ждете. Ваш компилятор выдает пятьдесят строк текста. Вы выбираете слова warning и error. Задумываетесь, значит ли это, что все в порядке. Вы ищите полученный исполняемый файл. Ничего. Черт возьми, думаете вы, я должен выяснить, что все это значит …

Типы ошибок компиляции

Во-первых, давайте различать типы ошибок. Большинство компиляторов покажет три типа предупреждений во время компиляции:

  • предупреждения компилятора;
  • ошибки компилятора;
  • ошибки компоновщика.

Хоть вы и не хотите игнорировать их, предупреждения компилятора не являются чем-то достаточно серьезным, чтобы не скомпилировать вашу программу. Прочитайте следующую статью, которая расскажет вам, почему стоит дружить с компилятором и его предупреждениями. Как правило, предупреждения компилятора — это признак того, что что-то может пойти не так во время выполнения. Как компилятор узнает об этом? Вы, должно быть делали типичные ошибки, о которых компилятор знает. Типичный пример — использование оператора присваивания = вместо оператора равенства == внутри выражения. Ваш компилятор также может предупредить вас об использовании переменных, которые не были инициализированы и других подобных ошибках. Как правило, вы можете установить уровень предупреждений вашего компилятора — я устанавливаю его на самый высокий уровень, так что предупреждения компилятора не превращаются в ошибки в выполняемой программе (“ошибки выполнения”).

Тем не менее, предупреждения компилятора не должны останавливать работу вашей программы (если только вы не укажете компилятору рассматривать предупреждения как ошибки), так что они, вероятно, не так серьезны как ошибки.

Ошибки — это условия, которые препятствуют завершению компиляции ваших файлов.

Ошибки компилятора ограничены отдельными файлами исходного кода и являются результатом “синтаксических ошибок”. На самом деле, это означает, что вы сделали что-то, что компилятор не может понять. Например, выражение for(;) синтаксически не правильно, потому что цикл всегда должен иметь три части. Хотя компилятор ожидал точку с запятой, он мог также ожидать условное выражение, поэтому сообщение об ошибке, которое вы получите может быть что-то вроде:

line 13, unexpected parenthesis ‘)’

Заметьте, что ошибки компилятора всегда будут включать номер строки, в которой была обнаружена ошибка.

Даже если вы прошли процесс компиляции успешно, вы можете столкнуться с ошибками компоновщика. Ошибки компоновщика, в отличие от ошибок компилятора, не имеют ничего общего с неправильным синтаксисом. Вместо этого, ошибки компоновщика — это, как правило, проблемы с поиском определения функций, структур, классов или глобальных переменных, которые были объявлены, но не определены, в файле исходного кода. Как правило, эти ошибки будут иметь вид:

could not find definition for X

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

Ошибки компилятора — с чего начать?

Если вы столкнулись с перечнем пятидесяти или шестидесяти ошибок и предупреждений, то будет сложно определить с чего начать. Самое лучшее место, тем не менее, в начале списка. В самом деле, вы почти никогда не начинаете исправлять ошибки от конца файла до его начала по одной простой причине: вы не знаете ошибки ли они на самом деле!

Одна ошибка в верхней части вашей программы может вызвать целый ряд других ошибок компилятора, потому что эти строки могут рассчитывать на что-то в начале программы, что компилятор не смог понять. Например, если вы объявляете переменную с неправильным синтаксисом, компилятор сообщит о синтаксических ошибках, и что он не может найти объявление для переменной. Точка с запятой, поставленные не в том месте, могут привести к огромному количеству ошибок. Это происходит, потому что синтаксис C и C++ синтаксис позволяет объявить тип сразу же после его определения:

struct 
{
   int x;
   int y;
} myStruct;

код создаст переменную, MyStruct, с местом для хранения структуры, содержащей два целых числа. К сожалению, это означает, что если вы опустите точку с запятой, компилятор будет интерпретировать это так, как будто следующая вещь в программе будет структурой (или возвращает структуру).

Что-то вроде этого:

struct MyStructType
{
   int x;
   int y;
}

int foo()
{}

может привести к огромному количеству ошибок, возможно, включая сообщения:

extraneous ‘int’ ignored

Все это из-за одного символа! Лучше всего начать с самого верха.

 Анализ сообщения об ошибке

Большинство сообщений от компилятора будет состоять как минимум из четырех вещей:

  1. тип сообщения — предупреждение или ошибка;
  2. исходный файл, в котором появилась ошибка;
  3. строка ошибки;
  4. краткое описание того, что работает неправильно.

Вывод g++ для указанной выше программы может выглядеть следующим образом (ваши результаты могут отличаться, если вы используете другой компилятор):

foo.cc:7: error: semicolon missing after struct declaration

foo.cc это имя файла. 7 — номер строки, и ясно, что это ошибка. Короткое сообщение здесь весьма полезно, поскольку оно показывает именно то, что не правильно. Заметим, однако, что сообщение имеет смысл только в контексте программы. Оно не сообщает, в какой структуре не хватает запятой.

Более непонятным является другое сообщение об ошибке из той же попытки компиляции:

extraneous ‘int’ ignored

Программист должен выяснить, почему это произошло. Обратите внимание еще раз, что эта ошибка была вызвана проблемой в начале программы, не в строке 8, а раньше, когда в структуре не хватает точки с запятой. К счастью, понятно, что определение функции для foo было в порядке, это говорит нам о том, что ошибка должна быть где-то в другом месте программы. На самом деле, она должна быть в программе раньше — вы не будете получать сообщение об ошибке, которое указывает на синтаксическую ошибку до строки, на которой ошибка на самом деле произошла.

Это руководящий принцип вычисления ошибок компилятора: если сомневаетесь, посмотрите в программе раньше. Так как синтаксические ошибки могут позже иметь серьезные последствия, вполне возможно, что компилятор указывал номер строки, в которой на самом деле не было синтаксической ошибки!

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

Обработка непонятных или странных сообщений

Есть несколько особенно сложных типов ошибок компилятора. Первый — это необъявленная переменная, которую, как вам кажется, вы объявили. Часто, вы можете указать, где именно переменная была объявлена! Проблема в том, что часто переменная просто написана с ошибкой. К сожалению, это довольно трудно увидеть, так как обычно мы читаем то, что ожидаем, а не то, что есть на самом деле. Кроме того, есть и другие причины, почему это может быть проблемой — например, проблемы с видимостью!

Чтобы разобраться в возможных проблемах, я делаю так: в строке, где находится якобы необъявленная переменная, надо выполнить поиск текстовым редактором слова под курсором (в качестве альтернативы можно скопировать имя переменной и выполнить поиск), и если я записал его неправильно, оно не найдется. Также не надо вводить имя переменной вручную, так как вы случайно можете ввести его правильно.

Второе непонятное сообщение:

unexpected end of file

Что происходит? Почему конец файла будет «неожиданным» ? Ну, здесь главное думать как компилятор; если конец файла является неожиданным, то он,  должно быть, чего-то ждет. Что бы это могло быть? Ответ, как правило, «завершение». Например, закрывающие фигурные скобки или закрывающие кавычки. Хороший текстовый редактор, который выполняет подсветку синтаксиса и автоматический отступ, должен помочь исправить некоторые из этих ошибок, что позволяет легче обнаружить проблемы при написании кода.

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

Наконец, если ничего не работает, вы всегда можете просто переписать несколько строк кода, чтобы убрать любые скрытые синтаксические ошибки, которые вы могли не увидеть. Это может быть опасно, так как вы можете переписать не ту секцию, но это может помочь.

Ошибки компоновщика

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

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

undefined function

Обратите внимание на поддержку этих функций компилятором (это может произойти, если вы включите собственное объявление функции, чтобы обойти ошибку во время компиляции). Если ваш компилятор поддерживает эту функцию, то для решения проблемы обычно требуются конкретные настройки компилятора. Вам следует сообщить компилятору, где искать библиотеки и убедиться, что библиотеки были установлены правильно.

Ошибки компоновщика могут произойти в функциях, которые вы объявили и определили, если вы не включили все необходимые объектные файлы в процесс связывания. Например, если вы пишете определение класса в myClass.cpp, а ваша основная функция в myMain.cpp, компилятор создаст два объектных файла, myClass.o и myMain.o, а компоновщику будут нужны оба из них для завершения создания новой программы. Если оставить myClass.o, то у него не будет определения класса, даже если вы правильно включите myClass.h!

Иногда появляются незначительные ошибки, когда компоновщик сообщает о более чем одном определении для класса, функции или переменной. Эта проблема может появиться по нескольким причинам: во-первых, у объекта может быть два определения — например, две глобальные переменные объявлены как внешние переменные, чтобы быть доступными за пределами файла исходного кода. Это относится как к функциям, так и к переменным, и это, на самом деле, нередко случается. С другой стороны, иногда это проблема с директивами компоновщика; несколько раз я видел, как люди включают несколько копий одного и того же объектного файла в процесс связывания. И бинго, у вас есть несколько определений. Типичным проявлением этой проблемы является то, что у целого ряда функций есть несколько определений.

Последний странный тип ошибки компоновщика — сообщение

undefined reference to main

Данная ошибка компоновщика отличается от других тем, что она может не иметь ничего общего с объектом, включая файлы или правильные пути к вашей библиотеке. Напротив, это означает, что компоновщик пытался создать исполняемый файл и не смог понять, где расположена функция main(). Это может случиться, если вы забыли включить основную функцию, или, если вы попытаетесь скомпилировать код, который никогда не был отдельным исполняемым файлом (например, если вы попытались скомпилировать библиотеку).

  • При клонировании диска acronis выдает ошибку файловая система повреждена
  • При клонировании диска acronis выдает ошибку не удалось заблокировать диск
  • При каком способе отбора единиц выборочной совокупности ошибка выборки будет наименьшей
  • При каком способе отбора единиц выборочной совокупности ошибка выборки будет наибольшей
  • При каком равновесном положении стрелки буссоли относительная ошибка определения b минимальна