Компоновщик сообщает вам, что существует "неразрешенный внешний символ".Это означает, что он не может найти определение для функции (функций), которую вы пытались вызвать.В этом случае есть две такие неопределенные функции: CreateWindowExA
и RegisterClassA
.
Очевидно, что определение этих функций находится не в вашем коде, а в библиотеках API Windows, так что выВам нужно будет сообщить компоновщику, где он может найти эти определения.
SDK поставляется с файлами-заглушками (*.lib
), которые содержат информацию, используемую компоновщиком, чтобы он мог найти правильные определения функций вWindows DLL во время выполнения.Вам нужно указать компоновщику, где он может найти эти *.lib
файлы.
Для этого есть несколько различных стратегий:
Простой (хотя и не-портативный) способ - вставить оператор #pragma
в исходный файл, который указывает компилятору оставить комментарий, распознаваемый компоновщиком.Например,
#pragma comment(lib, "user32")
автоматически связывается с user32.lib
, который является заглушкой для user32.dll
.
В качестве альтернативы, вы можете передать параметры вкомандная строка до cl.exe
.Это очень сложно, если вы спешите, если вы не используете MSBuild или какой-то другой make-файл.В этом случае вам потребуется изменить (как минимум) командную строку:
cl test.c user32.lib
Обе эти опции, естественно, предполагают, что каталог Windows SDK был добавлен в путь.Я почти уверен, что установщик сделает это автоматически, но я не уверен.Если это не так или вы удалили эти файлы из своего пути, вам нужно будет использовать полные пути к файлам *.lib
в командной строке.
Чтение документациидля возможных опций компилятора - хорошее место для начала.Или еще лучше, если вы не знакомы с программированием Windows, используя среду, подобную Visual Studio, которая автоматически собирает все эти вещи для вас .Как только вы поймете, что происходит, посмотрите, что представляет собой командная строка, которую запускает Visual Studio, и разбейте ее побитно.
Следующая проблема заключается в том, что вы компилируете без Определен Unicode, и поскольку ANSI является значением по умолчанию , все макросы в заголовочных файлах Windows разрешают вызывать суффиксные версии A
всех функций SDK.Это, вероятно, не то, что вы хотите.Windows была полностью Unicode уже более десяти лет, и все новые приложения должны быть построены как Unicode.Версии Unicode имеют суффикс W
, добавленный к их имени.
Опять же, вы можете указать компилятору явно создавать Unicode, либо добавляя строки в ваш исходный файл, либо добавляя параметры в вашу командную строку.
В этом случае, возможно, самый простой способ - просто добавить
#define UNICODE
в начало исходного файла перед #include <windows.h>
.Как мы видели выше, из среды Visual Studio UNICODE
автоматически определяется для вас, если вы явно не измените настройки своего проекта, чтобы настроить его на что-то другое.