Я начал процесс воплощения своих программных идей в жизнь. Моя проблема в том, что я не могу заставить API работать и работать.
Я использую код Visual Studio и компилятор mingw x64.
я просто запускаю пример кода от Microsoft о том, как создать программу Direct2D,
и базовый класс окна из управления состоянием приложения,
единственная разница в том, что я поленился и скопировал и вставил класс basewidow вместо того, чтобы включить его, как они сделали с basewin.h
Эта проблема:
когда я запускаю пример кода, я получаю эту ошибку,
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\uub17\AppData\Local\Temp\ccti919g.o:myprogram.cpp:(.text$_Z17D2D1CreateFactory17D2D1_FACTORY_TYPERK5_GUIDPPv[_Z17D2D1CreateFactory17D2D1_FACTORY_TYPERK5_GUIDPPv]+0x2b): undefined reference to `D2D1CreateFactory'
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../lib/libmingw32.a(lib64_libmingw32_a-crt0_c.o): in function `main':
C:/M/mingw-w64-crt-git/src/mingw-w64/mingw-w64-crt/crt/crt0_c.c:18: undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status
я немного поискал и обнаружил, что API делится на Ansi и Unicode, поэтому я попробовал Unicode-версию точки входа API «winMain» вместо «wwinMain» и изменил «pwstr» на «pstr», когда я запускаю затем я получаю этот вывод в терминале,
In instantiation of 'BOOL BaseWindow<DERIVED_TYPE>::Create(PCWSTR, DWORD, DWORD, int, int, int, int, HWND, HMENU) [with DERIVED_TYPE = MainWindow; BOOL = int; PCWSTR = const wchar_t*; DWORD = long unsigned int; HWND = HWND__*; HMENU = HMENU__*]':
myprogram.cpp:202:20: required from here
myprogram.cpp:54:37: error: cannot convert 'PCWSTR' {aka 'const wchar_t*'} to 'LPCSTR' {aka 'const char*'} in assignment
54 | wc.lpszClassName = ClassName();
| ~~~~~~~~~^~
| |
| PCWSTR {aka const wchar_t*}
myprogram.cpp:59:33: error: cannot convert 'PCWSTR' {aka 'const wchar_t*'} to 'LPCSTR' {aka 'const char*'}
59 | dwExStyle, ClassName(), lpWindowName, dwStyle, x, y,
| ~~~~~~~~~^~
| |
| PCWSTR {aka const wchar_t*}
In file included from C:/msys64/mingw64/include/windows.h:72,
from myprogram.cpp:1:
C:/msys64/mingw64/include/winuser.h:2203:65: note: initializing argument 2 of 'HWND__* CreateWindowExA(DWORD, LPCSTR, LPCSTR, DWORD, int, int, int, int, HWND, HMENU, HINSTANCE, LPVOID)'
2203 | WINUSERAPI HWND WINAPI CreateWindowExA(DWORD dwExStyle,LPCSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam);
Я провел дополнительные поиски и где-то увидел, что мой компилятор mingw crt не поддерживает юникод, широкие символы или что-то в этом роде и должен использовать WinMain, поэтому я оставил WinMain в качестве точки входа и определил UNICODE и _UNICODE, которые уже определены в папке свойств cpp json, и я получаю это в терминале
C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\uub17\AppData\Local\Temp\ccT85reo.o:myprogram.cpp:(.text$_Z17D2D1CreateFactory17D2D1_FACTORY_TYPERK5_GUIDPPv[_Z17D2D1CreateFactory17D2D1_FACTORY_TYPERK5_GUIDPPv]+0x2b): undefined reference to `D2D1CreateFactory'
collect2.exe: error: ld returned 1 exit status
Я мало что знаю, но я зашел так далеко, что изменил все, что связано со строками, на версии ansi и unicode, чтобы устранить необходимость преобразования, но в целом я получаю тот же результат.
Я не понимаю, как код с сайта Microsoft может дать сбой и как компилятор, созданный для win32, не поддерживает то, что поддерживает ОС.
я буквально не могу запустить пример кода, лол, пожалуйста, просветите меня
как правило, все, что я пробовал, менялось на версии функций, которые являются ansi, в любом случае пытаясь использовать Unicode, хотя, по-видимому, он несовместим с моим компилятором из-за использования различных макросов и определений, предоставленных Microsoft, и проверки настроек vscode json и сборки, которые
c_cpp_properties.json
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"compilerPath": "C:\\msys64\\mingw64\\bin\\gcc.exe",
"cStandard": "gnu17",
"cppStandard": "gnu++17",
"intelliSenseMode": "windows-gcc-x64"
}
],
"version": 4
}
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe build active file",
"command": "C:\\msys64\\mingw64\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "compiler: C:\\msys64\\mingw64\\bin\\g++.exe"
}
]
}
запуск.json
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:\\msys64\\mingw64\\bin\\gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe build active file"
}
]
}
Почему бы вам не попробовать Visual Studio Community Edition вместо VSCore+MinGW? Это бесплатно, и вы не будете иметь дело с проблемами MinGW - я просто больше не использую его, но для очень простых вещей это слишком раздражает: последняя версия, которая у меня была (поставляется с Qt 6.2.3), не позволяет даже компилировать исполняемые файлы отладки прямо из коробки! Вам также может не хватать надлежащего WinSDK и/или DirectX SDK...
@IInspectable спасибо, что информация очень помогла, и yeeeeeaaahh, «С другой стороны, я бы все равно не использовал VS Code. К тому времени, когда вы захотите отладить свою программу, вы бы предпочли, чтобы вместо этого вы использовали Visual Studio», я замечаю, что довольно быстро. Есть ли какие-либо другие компиляторы, о которых я должен знать или держаться подальше, лол, я действительно не хочу проходить через это снова
@Wisblade только что скачал его
@IInspectable VSCode может быть хорошим инструментом, но когда вы используете его для того, для чего он лучше всего (ИМХО): управление nix/embedded удаленная машина из-под Windows с неплохим интерфейсом и разными взаимосвязанными инструментами... Или как текстовый редактор общего назначения. Для меня в режиме IDE это хорошая альтернатива Eclipse (или голому SSH-терминалу...), потому что Eclipsecking ОГРОМНЫМ и медленным, как мучительная смерть. Но никак не сравнится с Visual Studio для разработки под Windows... Даже QtCreator намного ниже VS, а QtC уже продвинутее VSCode.
D2D1CreateFactory
не может быть найден, потому что вы не связываете D2d1.lib
, как указано в https://docs.microsoft.com/en-us/windows/win32/api/d2d1/nf-d2d1-d2d1createfactory.
Добавьте аргумент -ld2d1
в командную строку. Возможно, вам нужно также использовать директиву -L
для указания каталога.
Для компилятора MSVC можно использовать директиву pragma
(которая, вероятно, не работает для mingw
).
#pragma comment(lib, "d2d1")
ОТРЕДАКТИРОВАНО
Добавлено "-ld2d1",
непосредственно перед "-o",
.
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-ld2d1",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
Сек, спасибо, чувак, да, у меня был комментарий прагмы, но я использую mingw. Я добавил аргументы в командную строку и получил следующие результаты. У меня мало знаний об использовании терминала, я просмотрел аргументы командной строки для кода vs, но не смог найти те, которые вы мне показали здесь.
- 1d21 + - 1d21 + ~ Отсутствует выражение после унарного оператора '-'. В строке: 1 символ: 3 + - 1d21 + ~~~~ Неожиданный токен '1d21' в выражении или операторе. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingExpressionAfterOperator
- L + - L + ~ Отсутствует выражение после унарного оператора '-'. В строке: 1 символ: 3 + - L + ~ Неожиданный токен 'L' в выражении или операторе. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingExpressionAfterOperator + - L 1d2d1 + ~ Отсутствует выражение после унарного оператора '-'. В строке:1 символ:3 + - L 1d2d1 + ~ Неожиданный токен 'L' в выражении или операторе. + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : MissingExpressionAfterOperator
Не пытайтесь напечатать это из моего ответа, просто скопируйте, потому что это -ld2d1
. Например, поставьте "-ld2d1",
перед "-o",
(я предполагаю, что у вас есть библиотека d2d1).
Сек, ты лучший, это сработало
Может быть, попробовать базовую программу
MessageBox
hello world, прежде чем переходить к Direct2d...