Для устаревшего проекта у меня есть решение в Visual Studio 2010, которое компилируется с использованием компилятора Visual Studio 6 с использованием Нарцисс удлинение для Visual Studio 2010.
Я пытаюсь сделать входные данные компилятора (и компоновщика) равными (насколько это возможно) входным данным, которые у меня были бы при использовании Visual Studio 6. Поэтому я сравниваю файл журнала сборки проекта VS2010 с журналом сборки файл того же проекта в VS6.
Я заметил, что при сборке в VS2010 переключатели компилятора, передаваемые в сгенерированную командную строку, отличаются. Некоторые из этих различий я могу исправить в настройках файла проекта в VS2010, но другие я не могу найти: например, /FD
а также /TP
переключатели присутствуют при сборке с VS6, но отсутствуют при сборке с VS2010, и я не могу найти эти переключатели в настройках проекта в IDE. и все же другие различия, которые я не могу устранить, потому что я не могу найти переключатели по умолчанию для VS6 (да, я пробовал Google): например, /EHsc
Переключатель присутствует при сборке с VS2010, но отсутствует при сборке с VS6, это разница или это компилятор VS6 по умолчанию?
Итак, мой вопрос:
PS:
* переключатели компилятора, которые я заметил, присутствовали в VS6, но отсутствовали в VS2010: /FD
* переключатели компилятора, которые я заметил отсутствующими в VS6, но присутствующими в VS2010: /EHsc
/Gd
/TP
/WX-
/O2
/Oy-
Я знаю, что большая часть этого, вероятно, исправима в настройках проекта, но я все равно решил добавить полный список для этого проекта, надеясь, что кто-нибудь сможет пролить немного света на особенно проблемные переключатели компилятора для выравнивания.
ОБНОВИТЬ: Хорошо, вот что я нашел и решил:
/WX-
Переключатель (обрабатывать предупреждения как ошибки), вероятно, безвреден, если предположить, что это отрицание переключателя, который изначально отсутствовал, похоже, не имеет никакого эффекта, я подозреваю, что он введен Daffodil /O2
Переключатель (предпочтение быстрого кода) подразумевает несколько других оптимизационных переключателей и был серьезной ошибкой, удаленной клиринг настройка оптимизации в настройках проекта /Oy-
Параметр switch (пропустить указатель кадра) также, вероятно, безвреден, если предположить, что это отрицание переключателя, который изначально отсутствовал, похоже, не имеет никакого эффекта, я подозреваю, что он введен Daffodil /D _VC80_UPGRADE=0x0600
переключатель, который был введен IDE, но он не имеет смысла для компилятора VS6, поэтому он безвреден /EHsc
переключатель (синхронная обработка исключений), очевидно, такой же, как /GX
переключатель, который уже присутствовал изначально, так что, кажется, все в порядке /Gd
переключатель (по умолчанию cdecl
соглашение о вызовах), по-видимому, является значением по умолчанию для компилятора VS6, поэтому его присутствие безвредно, я подозреваю, что оно вводится либо Daffodil, либо IDE /TP
Переключатель (обрабатывать все файлы как исходные файлы C ++). Я не могу найти, как настроить это где-либо, но со смешанными источниками это потенциально опасно, я не знаю, как избавиться от этого переключателя, он вводится либо Daffodil, либо IDE И тогда компоновщик переключается … Мне удалось выровнять большинство из них, кроме:
/stack
Параметр switch (зарезервированный размер стека) является шестнадцатеричным в VS6, но десятичным и заключен в кавычки в VS2010, поэтому мне пришлось указать его в командной строке, но … /machine:I386
а также /mapinfo:lines
Коммутаторы не известны в VS2010, поэтому мне пришлось указать их в командной строке. они добавляются в самый конец командной строки компоновщика после списка файлов, который легко пропустить, и я не уверен на 100%, что компоновщик действительно выбирает дополнительные ключи после списка файлов. /TP
переключатель добавлен IDE.
/stack
Коммутатор принимает значения в десятичной или Си-языковой нотации. Я провел быструю проверку, и компоновщик VC6, по-видимому, правильно интерпретирует значения в кавычках, поэтому я не думаю, что вам нужно указывать их отдельно.
/machine
значения могут быть указаны на странице свойств Linker \ Advanced, хотя выглядит, что список выбираемых значений не совсем соответствует документации VC6. Это может быть ошибка Daffodil, или может быть, что документация неточна.
/mapinfo
переключатель должен быть добавлен в «Дополнительные параметры», как вы упомянули.
Если вы не отключили ведение журнала, вы можете проверить файл журнала команд вашего компоновщика (link.command.1.log
), чтобы увидеть точные ключи, переданные в командной строке. Я проверил это с /mapinfo
переключатель, и он добавляется в конец командной строки, как и ожидалось.
Других решений пока нет …