GCC - Компиляция неопределенной ссылки C на `wWinMain'

Я пытаюсь скомпилировать C с помощью gcc в командной строке, но получаю эту неопределенную ссылку на ошибку `wWinMain'.

Сначала я получал неопределенную ссылку на `WinMain', но я исправил это, добавив аргумент:

-муникод

Теперь `wWinMain' не определено. Как это исправить?

C:\Development\WA\Library\Backend\C\CB\CB>gcc CB.c -lssl -lcrypto -municode
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: 
C:/Strawberry/c/bin/../lib/gcc/x86_64-w64-mingw32/8.3.0/../../../../x86_64-w64-mingw32/lib/../lib/libmingw32.a(lib64_libmingw32_a-crt0_w.o):crt0_w.c:(.text+0x21): undefined reference to `wWinMain'
collect2.exe: error: ld returned 1 exit status

person Xayris    schedule 10.03.2021    source источник
comment
И, конечно, вы можете легко исправить это, удалив -municode (извините, не удержался). Итак, какова точка входа в этот C? Если у него нет WinMain, то что у него есть, main? Или это библиотека без точки входа?   -  person dratenik    schedule 10.03.2021
comment
@dratenik Да, это библиотека. Как я уже писал, если я удалю -municode, я получу неопределенную ссылку на WinMain. Если я добавлю его, я получу неопределенную ссылку на `wWinMain'.   -  person Xayris    schedule 10.03.2021
comment
Что вы ожидаете получить? Без аргументов вы просите создать .exe файл. Если вам нужен объектный файл .o, вам нужно добавить -c, если вам нужен .dll, я понятия не имею, что пришло в голову, но я уверен, что вы можете найти правильные варианты для использования где-нибудь.   -  person dratenik    schedule 10.03.2021


Ответы (1)


gcc CB.c -lssl -lcrypto скомпилирует и свяжет приложение, которое в Windows по умолчанию является оконным приложением, для которого точкой входа является WinMain (которого, очевидно, нет в вашей библиотеке и в котором он не нуждается).

Добавление -municode просто указывает системе использовать Windows Unicode API, а затем точка входа становится wWinMain, и у вас все еще есть та же проблема.

Чтобы построить DLL, добавьте -shared: gcc CB.c -shared -lssl -lcrypto

person koder    schedule 10.03.2021
comment
Хорошо, я получаю свою ошибку. Мне нужна DLL, и я попытался добавить -shared. Теперь он работает, но он все еще генерирует .exe - person Xayris; 10.03.2021
comment
@Xayris Возможно, вам придется добавить параметр -o. Пожалуйста, прочтите документацию и, возможно, какой-нибудь туториал для дальнейшего понимания. - person the busybee; 10.03.2021
comment
@Xayris, .exe — это расширение по умолчанию. Используйте -o cb.dll, чтобы указать имя вывода. - person koder; 10.03.2021
comment
@koder Большое спасибо, это сработало. Я прочитаю документ для получения дополнительной информации. - person Xayris; 10.03.2021