неопределенная ссылка на CreateSemaphoreEx при компиляции с gcc в Windows - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь скомпилировать некоторый код WinAPI с помощью компилятора gcc.Однако всякий раз, когда я вызываю такие функции, как CreateSemaphoreEx, CreateMutexEx (и некоторые другие функции Ex), я получаю «неопределенную ссылку на ссылку« CreateSemaphoreEx »».Он работает с CreateSemaphore или CreateMutex, но не с версиями Ex этих функций.

Сначала я скомпилировал флаг mwindows как таковой (gcc main.c -mwindows) Затем я попытался связать библиотеку вручную (gcc -lkernel32 main.c) Я также пытался использовать CreateSemaphoreExA

Я также пытался удалить и переустановить mingw-w64 и даже попытался переключиться на TDM-GCC

Я знаю, если я изменю его на вызов CreateSemaphore, он работает,однако я хочу использовать версию Ex.

#include <windows.h>

int main(int argc, char** argv)
{
    int initial_count = 0;
    int maximum_count = 5;

    HANDLE semaphore = CreateSemaphoreEx(0, initial_count, maximum_count, NULL, 0, SYNCHRONIZE | SEMAPHORE_MODIFY_STATE);
}

Как получить доступ к этим функциям WinAPI с помощью компилятора gcc в Windows (если это вообще возможно).

-------- Полный вывод компилятора ---------

main.c: In function 'main':
main.c:8:21: warning: implicit declaration of function 'CreateSemaphoreEx'; did you mean 'CreateSemaphoreA'? [-Wimplicit-function-declaration]
  HANDLE semaphore = CreateSemaphoreEx(0, initial_count, maximum_count, NULL, 0, SYNCHRONIZE | SEMAPHORE_MODIFY_STATE);
                     ^~~~~~~~~~~~~~~~~
                     CreateSemaphoreA
main.c:8:21: warning: initialization of 'HANDLE' {aka 'void *'} from 'int' makes pointer from integer without a cast [-Wint-conversion]
C:\Users\Nexwave\AppData\Local\Temp\cc3ncRYX.o:main.c:(.text+0x49): undefined reference to `CreateSemaphoreEx'
collect2.exe: error: ld returned 1 exit status

Редактировать 1: Я знаю о связывании.Мой вопрос заключается в том, отличается ли библиотека kernel32, используемая mingw-w64, от библиотеки компоновщика Microsoft.И если он отличается, то почему нет определения для CreateSemaphoreEx (и некоторых других функций Ex), которые доступны в реальном Kernel32.lib

1 Ответ

0 голосов
/ 21 июня 2019

Проблема, указанная в первой диагностике:

implicit declaration of function 'CreateSemaphoreEx'

Другие ошибки каскадные.В общем, вы должны всегда исправлять первую диагностику компилятора, прежде чем беспокоиться о других.

Обратите внимание, я бы порекомендовал использовать стандартные переключатели компилятора, чтобы они говорили «ошибка» вместо «предупреждение» для этого условия ошибки,и ломает компиляцию.Некоторые люди видят слово «предупреждение» и думают: «О, это просто предупреждение и не важно, я его проигнорирую», но в этом случае это будет ошибкой.


Сообщение об ошибке выше означаетчто ваши системные заголовки не определяют CreateSemaphoreEx.Почему это?Вот основные возможности:

  • Вы используете старую версию Windows;эта функция была добавлена ​​в Windows Vista и будет недоступна, например, если вы работаете в XP.(Заголовки Windows не определяют прототип и макрос, если система определяется как pre-Vista).
  • Вы используете старую версию mingw-w64, которая не имеет этой функции.
...