Как заставить Visual Studio использовать wmain вместо main?

Мне нужно разобрать параметры Unicode, поэтому я хотел использовать wmain вместо.

Так что вместо

int main(int argc, char** argv)

Я хотел бы использовать

int wmain(int argc, wchar_t** argv)

Проблема в том, что Visual Studio не распознает wmain, и вместо этого она пытается использовать main:

error LNK2019: unresolved external symbol main referenced in function __tmainCRTStartup

Вот что я попробовал:

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

    warning LNK4258: directive '/ENTRY:mainCRTStartup' not compatible with switch '/ENTRY:mainWCRTStartup'; ignored
    
  • Вместо этого попробовал _tmain, просто чтобы узнать, что это просто макрос, который меняет его на main.

  • Использование комментария #pragma (компоновщик, «/ SUBSYSTEM: CONSOLE / ENTRY: mainCRTStartup»)
  • Использование макроса UNICODE

Ничего не помогает

Редактировать:
Я хотел бы отметить, что я использую набор инструментов vs120_xp (Win xp compatibilitybile), но когда я попытался использовать набор по умолчанию, он все еще не работал.

Edit2:
Я попытался сделать новый проект, и wmain работал там из коробки. Мне не нужно было ничего менять, так что это должен быть какой-то конкретный параметр в текущем проекте, который его вызывает.

4

Решение

  Using the #pragma comment(linker, "/SUBSYSTEM:CONSOLE /ENTRY:mainCRTStartup")

Вы приближаетесь, не совсем близко. ЭЛТ имеет четыре точки входа:

  • mainCRTStartup => вызывает main (), точку входа для приложений в режиме консоли
  • wmainCRTStartup => вызывает wmain (), как указано выше, но версия Unicode
  • WinMainCRTStartup => вызывает WinMain (), точку входа для собственных приложений Windows
  • wWinMainCRTStartup => вызывает wWinMain (), как указано выше, но версия Unicode

Так что, это /ENTRY:wmainCRTStartup

Имейте в виду, что аргументы командной строки преобразуются в Unicode, используя кодовую страницу консоли по умолчанию. Что немного непредсказуемо, это устаревшая кодовая страница 437 OEM только в Западной Европе и Америке. Пользователю может понадобиться использовать команду CHCP (CHange Code Page) и поработать со шрифтом окна консоли, чтобы вы были довольны. YMMV.

9

Другие решения

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

В глубине библиотеки allegro в win / alconfig.h есть такие строки

#ifndef ALLEGRO_NO_MAGIC_MAIN
#if defined _MSC_VER && !defined ALLEGRO_LIB_BUILD
#pragma comment(linker,"/ENTRY:mainCRTStartup")
#endif
#endif

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

Я действительно не видел этого прихода!

0

По вопросам рекламы [email protected]