2017. Всё что делает бинарь - получает путь до рабочего стола запустившего его юзера, создает на нём txt файл в котором лежит hostname и username. В целях теста запустил его на виртуалке с юзернеймом в русской раскладке и случилось злое чудо. Бинарь не запускается, требует MSVCPD1400.dll и еще кучу библиотек. От бинарника требуется запуск на любой win10 машине. В include только прекомпилированные заголовки и либы:
#include <Shlobj_core.h>
#include <windows.h>
#include <string>
#include <iostream>
Вопроса 2:
Как скомпилить полностью независимый от вышеуказанных либ бинарь, возможно ли это?
Вопрос второй, ка решать проблему кириллицы в LPCWSTR и прочих win32 типах?
Видимо, надо собрать в релиз режиме.
Попробуй эти команды ввести, может поможет с кириллицей, хотя не уверен: SetConsoleOutputCP(1251); и SetConsoleCP(1251);
так неизвестно какой будет юзернейм, в кириллице или в англ раскладке. Вычитал про wchat_t (двухбайтовый символ, должен схавать и иврит и японский, русский подавно), но вин32 функа поиска директории (SHGetFolderPathA) ругается на все кроме char в качестве пятого аргумента(переменной, куда путь собственно и пишется)
Поставил релиз, ругается на unresolved external symbol
Хз, после подключения команд выше, у меня принимал любое значение, и английское и русское. Хотя в моем случае скорее принимали это значение массивы. Сложно всё таки, нужно ещё учиться и учиться ...
Сейчас разберусь с экстернал символами отвалившимися и проверю что выйдет на машине с русским юзернеймом
В студии надо указать нужный тип проекта, чтобы он дергал эти кучу .dll
Надо линковать стандартные библиотеки с и с++ статически, в виде объектных библиотек, а не библиотек импорта. Проблема кириллицы решать переводом консоли в кодировку ANSI. Вот как тут, но все 1251 #if defined(_WIN32) || defined(_WIN64) #pragma execution_character_set("utf-8") #include<windows.h> const auto _dummy_ = []() { SetConsoleCP(65001); SetConsoleOutputCP(65001); return 0; }(); #endif
Про ANSI понял, про процесс линковки нет, сейчас буду курить
https://docs.microsoft.com/ru-ru/cpp/build/reference/md-mt-ld-use-run-time-library?view=msvc-160 https://docs.microsoft.com/ru-ru/cpp/c-runtime-library/crt-library-features?view=msvc-160
А как решать проблему с external symbols? Это же проблема линковки насколько я понял?
Какую такую проблему?
Undefined external symbol trolololo@20
Эту проблему решать как всегда — добавлением нужных объектных файлов и библиотек.
Каких символов у тебя не хватает?
unresolved external symbol __imp__SHGetFolderPathA@20 В коде есть if (SHGetFolderPathA(NULL, CSIDL_PROFILE, NULL, 0, path) == S_OK)
вставь после инклюдов #pragma comment(lib, "Shell32.lib")
Всплыли error LNK2001: unresolved external symbol __CrtDbgReport error LNK2001: unresolved external symbol __free_dbg error LNK2001: unresolved external symbol __malloc_dbg
Сказать линкеру где его найти
Вот, сделай как тут пишут https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=msvc-160
Это вроде бы функция из библиотек Windows, она не должна была отключаться. Подключи обратно соотв. библиотеки если ты их отключил.
Не надо так делать, надо подключать библиотеки явно, указывая линкеру.
А ты обьясни ему как это сделать
Ну очень странно. А что ты сдела-то?
Обсуждают сегодня