Вопрос или проблема
Я только что установил новую систему Ubuntu 22.04 на свой рабочий стол. Затем запускаю установки:
sudo apt install build-essential git dkms
клонировал исходный код с https://github.com/brektrou/rtl8821CU
и запустил make
. После этого я получил следующую ошибку:
root@vsc:/home/vito/Downloads/rtl8821CU-master# make
make ARCH=x86_64 CROSS_COMPILE= -C /lib/modules/6.8.0-40-generic/build M=/home/vito/Downloads/rtl8821CU-master modules
make[1]: Entering directory '/usr/src/linux-headers-6.8.0-40-generic'
warning: the compiler differs from the one used to build the kernel
The kernel was built by: x86_64-linux-gnu-gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
You are using: gcc-12 (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
CC [M] /home/vito/Downloads/rtl8821CU-master/core/rtw_cmd.o
/home/vito/Downloads/rtl8821CU-master/core/rtw_cmd.c:29:1: error: unknown type name ‘sint’; did you mean ‘int’?
29 | sint _rtw_init_cmd_priv(struct cmd_priv *pcmdpriv)
| ^~~~
| int
/home/vito/Downloads/rtl8821CU-master/core/rtw_cmd.c:29:41: warning: ‘struct cmd_priv’ declared inside parameter list will not be visible outside of this definition or declaration
29 | sint _rtw_init_cmd_priv(struct cmd_priv *pcmdpriv)
| ^~~~~~~~
...
home/vito/Downloads/rtl8821CU-master/core/rtw_cmd.c: In function ‘rtw_cmd_filter’:
/home/vito/Downloads/rtl8821CU-master/core/rtw_cmd.c:438:1: error: control reaches end of non-void function [-Werror=return-type]
438 | }
| ^
cc1: some warnings being treated as errors
make[3]: *** [scripts/Makefile.build:243: /home/vito/Downloads/rtl8821CU-master/core/rtw_cmd.o] Error 1
make[2]: *** [/usr/src/linux-headers-6.8.0-40-generic/Makefile:1926: /home/vito/Downloads/rtl8821CU-master] Error 2
make[1]: *** [Makefile:240: __sub-make] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-6.8.0-40-generic'
make: *** [Makefile:2217: modules] Error 2
root@vsc:/home/vito/Downloads/rtl8821CU-master#
Использование ./dkms-install.sh
дает тот же результат.
В чем именно проблема и как ее можно исправить?
К сожалению, я не думаю, что вы получите ответ здесь. Возможно, вам стоит вернуться к репозиторию на Github, чтобы узнать, какие варианты поддержки они предлагают (например, поискать в разделе “issues”, чтобы увидеть, сталкивался ли кто-то с этой проблемой и исследуется ли она или уже решена).
С другой стороны, если вы знаете язык программирования C, вы можете посмотреть сами. Глядя на лог, который вы опубликовали, проблема, похоже, заключается в файле ./core/rtw_cmd.c
. Вы можете открыть файл в текстовом редакторе и посмотреть на указанную строку, чтобы выяснить, можете ли вы здесь что-то сделать.
Также, пожалуйста, будьте особенно осторожны при загрузке драйверов от сторонних поставщиков. У меня есть несколько USB Wi-Fi адаптеров марки TP-Link, использующих чипы Realtek, и сторонний репозиторий, который я посещал, чтобы получить ядровые модули драйверов, начал включать вредоносный код. Мне повезло, и у меня была более старая версия без вредоносного кода, но это может быть крайне опасно — иметь вредоносный модуль ядра, установленный в вашей системе.
Лучший вариант — получить исходный код или драйверы непосредственно от Realtek или OEM-производителя вашего устройства. Если такой вариант отсутствует (что было в моем случае, и думаю, что это то же самое для вашего), я в итоге приобрел конкретное Wi-Fi оборудование, на которое есть драйверы в основной линии ядра Linux, чтобы больше не иметь с этим дела.
Драйвер rtw88 поддерживает ваш адаптер (RTL8821CU) (10 месяцев назад)
Смотрите описание здесь
Ссылка на драйвер (rtw88), смотрите здесь.
Ответ или решение
Теория
Сборка и установка драйверов Wi-Fi из открытого исходного кода — это один из важных аспектов при эксплуатации Linux-систем, особенно для новых пользователей или тех, кто сталкивается с проблемами аппаратной совместимости. Драйверы, подобные rtl8821CU, часто требуют ручной компиляции, что может стать вызовом из-за ряда факторов, таких как зависимость от определённой версии ядра, инструментов сборки и корректности исходного кода.
Пример
Из предоставленной истории видно, что возникла ошибка при компиляции драйвера rtl8821CU на базе Ubuntu 22.04. Некоторые ключевые моменты из вашего опыта:
-
Предварительные установки: Вы установили необходимые инструменты с использованием команды
sudo apt install build-essential git dkms
, что является стандартной практикой для подготовки системы к компиляции драйверов. -
Клонирование и сборка: Исходный код был склонирован с GitHub и вы попытались выполнить
make
, при этом возникли ошибки, связанные с типами данных и кодом в файлеrtw_cmd.c
. -
Предупреждения компилятора: Было предупреждение о несовпадении версии компилятора, хотя в вашем случае это вряд ли основная проблема. Ошибка была связана с неизвестным типом данных
sint
и структуройcmd_priv
. -
Ошибки в коде: Ошибки типа "control reaches end of non-void function" указывают на неправильную обработку возвратов в функциях, что является серьёзной ошибкой в программировании на C.
Применение
Чтобы исправить выявленные проблемы и успешно компилировать драйвер:
-
Проверка и исправление исходного кода: Откройте файл
rtw_cmd.c
в текстовом редакторе и замените тип данныхsint
наint
, если нет определения дляsint
. Это может быть следствием устаревания кода. Убедитесь, что все функции возвращают значение, если они объявлены с типом возвращаемого значения, отличным отvoid
. -
Использование корректной версии ядра и инструментов: Убедитесь, что заголовочные файлы ядра, соответствующие установленной версии ядра (например,
6.8.0-40-generic
), установлены корректно. -
Проверка на GitHub: Посетите раздел "Issues" на GitHub репозитория драйвера. Возможно, другие пользователи уже столкнулись с той же проблемой и предложили решения.
-
Альтернативные драйверы: В случае, если вы не можете решить проблему с текущим драйвером, обратите внимание на альтернативные драйверы. Например, как упомянуто в вопросе, драйвер
rtw88
может поддерживать ваш адаптер. Ознакомьтесь с рекомендациями на GitHub, таким какhttps://github.com/morrownr/USB-WiFi
. -
Проверка безопасности: Всегда преисполняйтесь вниманием к безопасности при загрузке драйверов из сторонних источников. Вредоносные изменения могут быть внесены в код репозитория, поэтому проверяйте подлинность и отзывы пользователей.
-
Обновление оборудования: Если проблема продолжает оставаться нерешенной, возможно, стоит рассмотреть покупку нового Wi-Fi адаптера, который поддерживается напрямую ядром Linux. Это избавит вас от необходимости в ручной настройке и компиляции драйверов в будущем.
Заключение
Проблема с компиляцией драйвера rtl8821CU на Ubuntu 22.04 может требовать некоторых знаний в области программирования на C, управления библиотеками и зависимости, а также понимания системы сборки ядра Linux. Следуя предложенным рекомендациям, вы можете существенно улучшить свое окружение для разработки и избежать сложностей в будущем. В конечном итоге, если стандартизация не решает проблему, приобретение железа с большей поддержкой может быть оптимальным решением.