Изменение точки входа в приложение с VS2015 - PullRequest
0 голосов
/ 16 декабря 2018

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

Я использую подсистему: CONSOLE и выводит exe.Все работает, когда оно определено как

int main(int argc,CHAR  **argv) {}

Вещи компилируются нормально.

Затем я изменяю его на.

int main_test(int argc,CHAR  **argv) {}

И в точке входа Visual Studio Linker яизменив его с пустого значения на main_test, я начинаю получать тонну (например, 3500+) ошибок связывания, связанных с libcpmtd.lib и других символов, которые отсутствуют в моих файлах obj, таких как __stdio_common_vsscanf, что, очевидно, является встроенной функцией, которой я на самом деле не являюсьзвонить куда угодно.

Error   LNK2019 unresolved external symbol ___mb_cur_max_func referenced in function _Getcvt    MyProject C:\Source\project\src\libcpmtd.lib(xwctomb.obj)   1   

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

1 Ответ

0 голосов
/ 16 декабря 2018

Сначала вам нужно установить точку входа

Открыть диалоговое окно «Страницы свойств» проекта.Дополнительные сведения см. В разделе «Настройка свойств проекта Visual C ++».

Щелкните папку «Связыватель».

Откройте страницу свойств «Дополнительно».

Измените свойство точки входа.

и установите main_test

После, я не до конца понимаю почему, но необходимо сделать this

Открыть свойство проектаДиалоговое окно Страницы.Дополнительные сведения см. В разделе «Настройка свойств проекта Visual C ++».

Щелкните папку «Связыватель».

Откройте страницу свойств ввода.

Измените свойство «Ссылки на символьные параметры».

и установите _mainCRTStartup для x86 или mainCRTStartup для x64.

Или сделайте это программно в вашем коде:

#pragma comment(linker, "/ENTRY:main_test")
#if defined(_M_IX86)
# pragma comment(linker, "/INCLUDE:_mainCRTStartup")
#else
# pragma comment(linker, "/INCLUDE:mainCRTStartup")
#endif

#include <iostream>    

int main() {
   std::cout << "main" << std::endl;
   return 0;
}

int main_test()
{
   std::cout << "main_test" << std::endl;
   return 0;
}

Вывод

main_test

Обратите внимание, что main не является точкой входа по умолчанию .Точка входа для консольного приложения - _mainCRTStartup, которая вызывает main.Поэтому, изменяя точку входа, вы теряете CRT, и вам приходится вручную реализовывать такие вещи, как получение аргументов командной строки.Для более подробного ознакомления здесь

UPD

Я не думаю, что разработка вашей собственной ЭЛТ является хорошим решением, ее будет проще использоватьиз встроенных точек входа.

#pragma comment(linker, "/ENTRY:wmainCRTStartup ") // wmain will be called
//#pragma comment(linker, "/ENTRY:mainCRTStartup  ") // main will be called

#include <iostream>
#include <stdlib.h>


int main(int argc, char** argv) {
   for (int i = 0; i < argc; i++)
      std::cout << argv[i] << std::endl;
   return 0;
}

int wmain(int argc, wchar_t *argv[])
{
   for (int i = 0; i < argc; i++)
      std::wcout << argv[i] << std::endl;
   return 0;
}
...