У меня есть встроенное приложение IoT, которое я разработал для клиента 1,5 года назад.Приложение довольно большое и написано на C. Оно продолжает работать нормально.
Заказчик попросил меня добавить сенсорный дисплей HDMI вместе со сложной графикой.Я выбрал Qt в качестве графического фреймворка.Qt великолепен, однако, он написан на C ++.Не желая переписывать код C на C ++, я реорганизовал код C в коллекцию вызываемых методов или служб.
Да, я знаю, что C должен правильно компилироваться и выполняться на C ++.Однако любой, кто сделал это, должен сначала разработать код C с предположениями, что он будет скомпилирован и выполнен в среде C ++.В противном случае вы получите много ошибок компиляции и много переписывания.
Я создал все классы C ++ и сервисы C.Сначала я компилирую код C с помощью gcc и создаю файл c-object.o.В заголовочном файле c-кода я использовал следующее:
#ifdef __cplusplus
extern "C" {
#endif
Сначала я скомпилировал C-код и сгенерировал c-object.o.Как ни странно, я использую Qt creator для генерации .pro-файлов, qmake для генерации Makefile и make для компиляции и компоновки.
Я получаю все виды ошибок ссылок, потому что Makefile не имеет ссылки наC-код.Однако make выводит все свои команды g ++ на дисплей.Я просто копирую и вставляю в блокнот последнюю команду make g ++, которая связывает все файлы cpp-object.o - ту, которая создает все ошибки ссылки «ссылка на объект не найдена».Затем я копирую и вставляю в блокнот имена файлов c-object.o и имена библиотек в команде g ++.Я повторно запускаю измененную команду g ++, и все работает.chorusclient.o является c-объектом.
g++ -Wl,-O1 -o AvEdgeDemo chorusclient.o main.o login.o hud.o /
sqliteservices.o driveraccess.o maintenanceaccess.o /
fleetmanagementaccess.o iotdataaccess.o keyboard.o /
moc_login.o moc_hud.o moc_driveraccess.o /
moc_maintenanceaccess.o moc_fleetmanagementaccess.o /
moc_iotdataaccess.o moc_keyboard.o /
-L/usr/lib/arm-linux-gnueabihf -lQtSql -lQtGui /
-lQtCore -lpthread -lssl -lcrypto -ljson-c
Есть ли способ, которым я могу заставить qmake или make распознавать C-код и правильно компилировать и связывать?Вырезание, вставка и повторное связывание по меньшей мере неудобно!