2015-07-31 4 views
2

Я построил многоязычную программу обработки изображений программного обеспечения и сделал ее общедоступной с двоичными файлами для Mac OS X и Ubuntu. Бинарные файлы были протестированы в соответствующих операционных системах, и все работает отлично. Недавно я также попытался выпустить двоичные файлы для Windows (64 бит), но компилятор GCC (через MinGW-w64) дал мне предупреждения для одной из программ C при создании файла общей библиотеки (dll). Этого не произошло в Mac OS X или Ubuntu. Вот предупреждения и соответствующая строка кода в файле C:Предупреждение о компиляторе программы C только в Windows (MinGW-w64)

warning: passing argument 3 of '_beginthreadex' from incompatible pointer type [enabled by default] 

Line 464:

ThreadList[i] = (HANDLE)_beginthreadex(NULL, 0, &ThreadFunc, &ThreadArgs[i] , 0, NULL); 

Второй и чужд предупреждение:

c:\mingw\x86_64-w64-mingw32\include\process.h:31:29: note: 
expected 'unsigned int <*><void *>' but argument is of type 'void * <*><void *>' 
    _CRTIMP uintptr_t _cdecl _beginthreadex<void *_Security,unsigned _Stacksize,unsigned <_stdcall *_StartAddress> <void *>,void *_ArgList,unsigned _InitFlag,unsigned *_ThrdAddr >; 

Линия 34:

#include <process.h> 

Это относится к в этом большем блоке кода:

/* Multithreading stuff*/ 
#ifdef _WIN32 
#include <windows.h> 
#include <process.h> 
#else 
#include <pthread.h> 
#endif 

#include <stdbool.h> 

Проблема, кажется, исходит из #include <process.h> так как для Mac OS X и Ubuntu #include <pthread.h> используется. Любая помощь в определении этого? Полная программа C - here.

+1

Это предупреждающее сообщение и, вероятно, безвредно. Если ваша программа неожиданно завершается при запуске, это, скорее всего, из-за чего-то другого. –

+0

Другая программа, которую я скомпилировал без каких-либо предупреждений, успешно работает в составе этого программного обеспечения. Все остальные компоненты программного обеспечения работают нормально. А на Ubuntu и Mac OS X все программное обеспечение работает чудесно. Это оставляет этот файл C и предупреждающие сообщения. И я вижу из утверждений печати, что программа завершает работу в этом конкретном файле C. Это не может быть совпадением. – Haider

+1

Это выглядит как красная сельдь. Но ты эксперт. –

ответ

3

Сообщения при компиляции для окон, но не для других систем, неудивительны. Оскорбительный код будет отображаться только компилятором при построении для окон из-за использования макроса _WIN32, который определяется только компилятором при построении кода для окон.

«Второе и незнакомое предупреждение» описывает причину. Третий аргумент функции (специфичный для окна) _beginthreadex() указан как указатель на функцию, которая возвращает unsigned int. Фактически передается ThreadFunc - функция, которая возвращает void *.

Зафиксировать код, приемлемый для компилятора Windows, - изменить тип возврата ThreadFunc(), чтобы вернуть unsigned int. Это нарушит код для других систем, поэтому вам нужно сделать изменения условно (т. Е. Иметь две версии функции и выбрать правильный вариант, проверив макрос _WIN32).

#ifdef _WIN32 
/* use the windows version of the function here */ 
#else 
/* use the non-windows version of the function here */ 
#endif 
+1

Спасибо. Я думаю, что вы отвечаете на правильном пути. Но когда я изменяю тип возвращаемого значения, теперь сообщение об ошибке изменяется на 'expected 'unsigned int <*>', но аргумент имеет тип 'unsigned int * <*>'. 'В возвращаемом типе есть дополнительная звезда, которой не должно быть , Или я делаю что-то еще неправильно? – Haider

+1

Спасибо. Он работает, когда вы меняете его на 'unsigned int'. Не могли бы вы отредактировать это в своем ответе (в случае, если кто-то еще посмотрит). – Haider

+0

OK; сделанный. Ответить отредактировал. – Peter

Смежные вопросы