Tôi đang viết một ứng dụng tự động phát hiện việc cắm/rút phích cắm của thiết bị.
Tôi đang sử dụng C++ với khung Qt. libudev.h được bao gồm trong mã của tôi. Tôi thực sự đã vượt qua sudo apt-get cài đặt libudev-dev
Đã cài đặt gói libudev-dev nhưng QtCreator vẫn gặp thông báo lỗi:không tìm thấy gói phát triển libudev
Tệp.pro:
...
CẤU HÌNH += bảng điều khiển c++11
CẤU HÌNH -= app_bundle
unix: CẤU HÌNH += link_pkgconfig
unix: PKGCONFIG += libudev
TIÊU ĐỀ += DeviceManager.h
NGUỒN += main.cpp \
Trình quản lý thiết bị.cpp
...
Tệp DeviceManager.h:
#ifndef THIẾT BỊ QUẢN LÝ_H
#xác định DEVICEMANAGER_H
#include
#include
#include
#include
#include "DeviceModel.h"
lớp Trình quản lý thiết bị: QObject công khai
{
Q_ĐỐI TƯỢNG
public:
Trình quản lý thiết bị rõ ràng (QObject *parent = 0);
QSet getDevices();
QStringList getDevicePaths();
private:
QSet đã cắmThiết bị;
};
#endif // THIẾT BỊ QUẢN LÝ_H
Tệp DeviceManager.cpp:
#include "DeviceManager.h"
DeviceManager::DeviceManager(QObject *parent) :
QObject(cha mẹ)
{
}
QSet DeviceManager::getDevices()
{
QSet devices = QSet();
cấu trúc udev *udev;
struct udev_enumerate *enumerate;
cấu trúc udev_list_entry *dev_list, *dev_list_entry;
cấu trúc udev_device *dev;
struct udev_monitor *mon;
/*Tạo đối tượng udev */
udev = udev_new();
nếu (!udev)
{
qDebug() << "Không thể tạo udev";
trả lại thiết bị;
}
/* Thiết lập màn hình để giám sát các thiết bị ẩn */
mon = udev_monitor_new_from_netlink(udev, "udev");
udev_monitor_filter_add_match_subsystem_devtype(mon, "usb", "usb_device");
udev_monitor_enable_receive(mon);
liệt kê = udev_enumerate_new(udev);
udev_enumerate_add_match_subsystem(liệt kê, "usb");
udev_enumerate_scan_devices(liệt kê);
dev_list = udev_enumerate_get_list_entry(liệt kê);
QString ID nhà cung cấp, số sê-ri, tên nhà phát triển, tên thiết bị;
udev_list_entry_foreach(dev_list_entry, dev_list)
{
const char *đường dẫn;
đường dẫn = udev_list_entry_get_name(dev_list_entry);
dev = udev_device_new_from_syspath(udev, path);
udev_device_get_parent_with_subsystem_devtype(dev, "usb", "usb_device");
nếu (!dev)
{
qDebug() << "Không thể tìm thấy thiết bị usb gốc.";
trả lại thiết bị;
}
nhà cung cấpID = udev_device_get_property_value(dev, "ID_VENDOR_ID");
devName = udev_device_get_property_value(dev, "DEVNAME");
if (!vendorID.isNull() && VendorID.compare("04e8") == 0) // ID nhà cung cấp của thiết bị Samsung
{
DeviceModel *device = new DeviceModel();
serialNumber = udev_device_get_property_value(dev, "ID_SERIAL_SHORT");
deviceName = QString(udev_device_get_property_value(dev, "DEVPATH")).split("/").last();
nếu (! SerialNumber.isNull())
{
thiết bị->setDownloadMode(false);
thiết bị->setSerialNumber(serialNumber);
}
khác nếu(!devName.isNull())
{
thiết bị->setPath(devName);
thiết bị->setDownloadMode(true);
}
khác
phá vỡ;
thiết bị->setName(deviceName);
thiết bị.insert(thiết bị);
}
udev_device_unref(dev);
}
/* Giải phóng đối tượng điều tra viên */
udev_enumerate_unref(liệt kê);
udev_unref(udev);
cái này->pluggedDevices = thiết bị;
trả lại thiết bị;
}
QStringList DeviceManager::getDevicePaths()
{
Kết quả QStringList;
if (this->pluggedDevices.isEmpty())
{
return result;
}
foreach (DeviceModel *thiết bị, this->pluggedDevices)
{
result.append(device->getPath());
}
return result;
}
môi trường:
Hệ điều hành: Ubuntu 18.04.2 LTS
Qt Creator 4.5.2 dựa trên Qt 5.9.5 (GCC 7.3.0, 64bit)
Bạn có thể giúp tôi tìm một lý do?
Thông báo lỗi cho biết bạn đang thiếu libudev-dev
hoặc pkg-config
. Vì bạn đã cài đặt libudev-dev
, có nghĩa là thứ bạn đang thiếu là pkg-config
dụng cụ. Nếu lệnh:
pkg-config --version
Không in một cái gì đó như thế này:
0,29,1
thế thì bạn đang thiếu pkg-config
dụng cụ. Cài đặt nó:
sudo apt cài đặt pkg-config
Điều này sẽ giải quyết vấn đề của bạn. Hãy nhớ xóa khỏi tệp dự án của bạn LIBS += -ludev
. Bạn chỉ cần PKGCONFIG +=libudev
.
Tôi là một lập trình viên xuất sắc, rất giỏi!