Непонятная ошибка при компиляции программы на "Малинке"

Модератор: Модераторы разделов

Ответить
MiK13
Сообщения: 1180
ОС: Linux Debian

Непонятная ошибка при компиляции программы на "Малинке"

Сообщение MiK13 »

Есть довольно много программ (несколько десятков файлов.c и больше десяти файлов.h)
Транслирую все через makefile. На моём рабочем (и домашнем) всё транслируется без проблем
Перенёс все файлы на "Малинку" (Raspberry Pi 4). Почти все странслировались без проблем. И правильно работают.
Кроме двух. В которых выскакивает одна и та же ошибка.

Код: Выделить всё

 $ make
gcc -std=c99 -Wall -Wextra -O2 -o send_udp send_udp.c
send_udp.c: In function ‘process_file’:
send_udp.c:204:53: error: incompatible type for argument 5 of ‘sendto’
             i=sendto(sockfdu, buf, head_pup.len, 0, (void *)&send_f, sizeof(send_f));
                                                     ^~~~~~~~~~~~~~~
In file included from send_udp.c:8:
/usr/include/arm-linux-gnueabihf/sys/socket.h:153:44: note: expected ‘__CONST_SOCKADDR_ARG’ {aka ‘union <anonymous>’} but argument is of type ‘void *’
          int __flags, __CONST_SOCKADDR_ARG __addr,
                       ~~~~~~~~~~~~~~~~~~~~~^~~~~~
make: *** [makefile:104: send_udp] Ошибка 1
Приччём, пробовал вместо void * поставлять другие типы -- ничего не помогает.
Но самое непонятное в том, что в других программах аналогичный вызов функции sendto не вызывает никаких вопорсов.
А всего

Код: Выделить всё

$ grep sendto *.c | wc
     70     612    7550
А всего эта функция вызывается больше, чем в 10 разных программах. Записана аналогично. Но у транслятора никаких вопросов не вызывает.

В чём может быть дело?

P.S. Единственное замеченное мное "принципиальное" отличие компилятора в Raspbian от компилятора Debian -- char -- беззнаковое 8-битное.
И ещё были предупреждения при выводе переменных типа int64_t -- там система 32-битная, поэтому это long long int, а на 64-битной это просто long int. Соответвенно непонятно, что использовать: "%ld" или "%lld". Но это всё решаемо. А вот почему в двух программах компилятор ругается на sendto понять не могу.
Спасибо сказали:
Аватара пользователя
s.xbatob
Сообщения: 1139
ОС: Fedora

Re: Непонятная ошибка при компиляции программы на "Малинке"

Сообщение s.xbatob »

аргумент 5 это struct sockaddr * . Туда и касть
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20791
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непонятная ошибка при компиляции программы на "Малинке"

Сообщение Bizdelnick »

MiK13 писал:
19.03.2021 16:01
Приччём, пробовал вместо void * поставлять другие типы -- ничего не помогает.
А просто выкинуть ненужное приведение типа не пробовали?
MiK13 писал:
19.03.2021 16:01
непонятно, что использовать: "%ld" или "%lld".
"%" PRId64
см. man inttypes.h
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1180
ОС: Linux Debian

Re: Непонятная ошибка при компиляции программы на "Малинке"

Сообщение MiK13 »

Bizdelnick писал:
19.03.2021 17:02
MiK13 писал:
19.03.2021 16:01
Приччём, пробовал вместо void * поставлять другие типы -- ничего не помогает.
А просто выкинуть ненужное приведение типа не пробовали?
Мне помнится, я с этого начинал. Просто писал &send_f. Для gcc это было нормально, но вот g++ это, по-моему, не нравилось.
И сейчас gcc на amd64 это воспринял нормально. На работе проверю на "Малинке".
Удивляет, что почти во всех других программах такая конструкция вопросов не вызывает. Только в двух.
Но надеюсь, что найду причину
Bizdelnick писал:
19.03.2021 17:02
MiK13 писал:
19.03.2021 16:01
непонятно, что использовать: "%ld" или "%lld".
"%" PRId64
см. man inttypes.h
Почему-то у меня оказалось, что нет мана на inttypes.h
Но я вспомнил, что уже решал эту проблему.
Заменил %12lld на %12"PRId64". Компилятор перестал ворчать. На работе проверю на малинке.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20791
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непонятная ошибка при компиляции программы на "Малинке"

Сообщение Bizdelnick »

MiK13 писал:
22.03.2021 02:47
Заменил %12lld на %12"PRId64". Компилятор перестал ворчать.
Чтобы точно перестал, добавьте пробелы между кавычками и макросом.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1180
ОС: Linux Debian

Re: Непонятная ошибка при компиляции программы на "Малинке"

Сообщение MiK13 »

Bizdelnick писал:
22.03.2021 14:30
MiK13 писал:
22.03.2021 02:47
Заменил %12lld на %12"PRId64". Компилятор перестал ворчать.
Чтобы точно перестал, добавьте пробелы между кавычками и макросом.
Собственно в той программе, в которой я когда-то использовал PRId64, я вокруг него ставил пробелы. Просто решил проверить, что скажет компилятор, если пробелов не будет. Он ничего не сказал.

Ну а что касается sendto, то тут, видимо, есть какие-то особенность компилятора для процессора ARM. Когда-то я ставил его. Сейчас решил пррверить им -- ситуация аналогичная

Код: Выделить всё

$ make
arm-linux-gnueabi-gcc -std=c99 -Wall -O2 -o send_udp send_udp.c
send_udp.c: In function ‘process_file’:
send_udp.c:204:65: error: incompatible type for argument 5 of ‘sendto’
             i=sendto(sockfdu, buf, head_pup.len, 0, /*(void *)*/&send_f, sizeof(send_f));
                                                                 ^
In file included from send_udp.c:8:0:
/usr/arm-linux-gnueabi/include/sys/socket.h:163:16: note: expected ‘__CONST_SOCKADDR_ARG {aka union <anonymous>}’ but argument is of type ‘struct sockaddr_in *’
 extern ssize_t sendto (int __fd, const void *__buf, size_t __n,
                ^~~~~~
makefile:7: ошибка выполнения рецепта для цели «send_udp»
make: *** [send_udp] Ошибка 1
Хотя программы с этой функцией я транслировал.
Попробую последовательно "собирать" программу. Посмотрю, когда ошибка возникнет.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20791
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непонятная ошибка при компиляции программы на "Малинке"

Сообщение Bizdelnick »

MiK13 писал:
23.03.2021 11:36
Просто решил проверить, что скажет компилятор, если пробелов не будет. Он ничего не сказал.
Некоторые версии gcc ругаются. Возможно, это зависит от выбранного стандарта языка, не помню точно. Лучше ставить.
MiK13 писал:
23.03.2021 11:36
Попробую последовательно "собирать" программу. Посмотрю, когда ошибка возникнет.
Да и так прекрасно видно, когда. Покажите, как объявлена send_f, и какие в send_udp.c включены заголовочники.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1180
ОС: Linux Debian

Re: Непонятная ошибка при компиляции программы на "Малинке"

Сообщение MiK13 »

Bizdelnick писал:
23.03.2021 11:58
MiK13 писал:
23.03.2021 11:36
Просто решил проверить, что скажет компилятор, если пробелов не будет. Он ничего не сказал.
Некоторые версии gcc ругаются. Возможно, это зависит от выбранного стандарта языка, не помню точно. Лучше ставить.
Понятно буду в будущем ставить.
Bizdelnick писал:
23.03.2021 11:58
MiK13 писал:
23.03.2021 11:36
Попробую последовательно "собирать" программу. Посмотрю, когда ошибка возникнет.
Да и так прекрасно видно, когда. Покажите, как объявлена send_f, и какие в send_udp.c включены заголовочники.
Кое что стало проясняться.
Вспомнил, что когда-то транслировал программы для ARMа, попробовал тот компилятор (arm-linux-gnueabi-gcc) -- такая же картина.
Но, как я понял, всё дело в заголовчниках. Сначала закомментировал все, потом стал по одному раскомментировать -- и в конце концов одна программа странслировалась. А вот вторая -- нет. Из-за кучи "#include", которые включены в локальный .h файл. Решил их убрать -- опять возникли проблемы.
Но теперь уже представляю где искать.
А объявлено

Код: Выделить всё

$ grep send_f send_udp.c 
struct sockaddr_in send_f = {AF_INET,SwaB(10149),{INADDR_BROADCAST},{}};
            i=sendto(sockfdu, buf, head_pup.len, 0, /*(void *)*/&send_f, sizeof(send_f));
SwaB -- макрос, который я написал до того, как узнал про htons (которую нельзя использовать в общем объявлении)
Причём, во всех программах объявление одинаковое. Только имена разные.
А инклюды, когда стала транслироваться:

Код: Выделить всё

#define _GNU_SOURCE
#define _XOPEN_SOURCE 600
#pragma pack(1)
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <error.h>
#include <errno.h>
#include <stdint.h>
#include <netinet/in.h>
//#include <sys/ipc.h>
//#include <sys/msg.h>
//#include <ctype.h>
//#include <sys/types.h>
//#include <sys/socket.h>
//#include <netinet/in.h>
//#include <signal.h>
//#include <sys/wait.h>
//#include <math.h>
//#include <sys/stat.h>
//#include <sys/types.h>
//#include <fcntl.h>
//#include <time.h>
//#include <sys/poll.h>
И ещё в локальном .h файле

Код: Выделить всё

#include <sys/types.h>
#include <sys/time.h>
#include <time.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <ctype.h>
Как я понимаю, надо будет с ними наводить порядок.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20791
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Непонятная ошибка при компиляции программы на "Малинке"

Сообщение Bizdelnick »

MiK13 писал:
23.03.2021 18:49

Код: Выделить всё

#pragma pack(1)
Кто ж так делает-то? У Вас стандартная библиотека без упаковки собрана, а Вы структуры, объявленные в её заголовочниках, пакуете. Уберите это. Используйте для своих структур атрибут packed, если надо их паковать.
Добавлено (19:24):
Кстати, проблема в Как найти ошибку, из-за которой вылетает программа? может быть по той же причине.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1180
ОС: Linux Debian

Re: Непонятная ошибка при компиляции программы на "Малинке"

Сообщение MiK13 »

Bizdelnick писал:
23.03.2021 19:04
MiK13 писал:
23.03.2021 18:49

Код: Выделить всё

#pragma pack(1)
Кто ж так делает-то? У Вас стандартная библиотека без упаковки собрана, а Вы структуры, объявленные в её заголовочниках, пакуете. Уберите это. Используйте для своих структур атрибут packed, если надо их паковать.
Спасибо. Попробую с этим разобраться.
Вообще я структуры объявляю так, чтобы никакая упаковка не требовалась. Я никогда не напишу

Код: Выделить всё

struct my_unpacked_struct  {
    char c;
    int i;
 };
А если что-то подобное будет требоваться, я либо c объявлю как int, либо после него добавлю char rez[3];
Но тогда пришлось состыковывать программы, в которых было много подобных структур.
Bizdelnick писал:
23.03.2021 19:04
Добавлено (23.03.2021 19:24):
Кстати, проблема в Как найти ошибку, из-за которой вылетает программа? может быть по той же причине.
Вряд ли. Я там разные варианты с упаковкой проверял.
Кроме того, в данном случае ошибка возникает не при выполнении, а при компиляции. Причём, для процессора ARM. Компиляторы i386 и amd64 транслируют без ошибок.
Спасибо сказали:
Ответить