Qt работает с C ++ и C кодом - PullRequest
0 голосов
/ 19 мая 2018

У меня есть встроенное приложение 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-код и правильно компилировать и связывать?Вырезание, вставка и повторное связывание по меньшей мере неудобно!

1 Ответ

0 голосов
/ 20 мая 2018

Понятия не имею, зачем ты все это делаешь.QMake прекрасно обрабатывает C-код.В проекте qmake (или проекте cmake!) Просто добавьте в проект файлы .c и .h.Вот и все.

Я имею в виду - сделайте это:

# AvEdgeDemo.pro    

template = app
qt = widgets
sources = \
  chorusclient.c \
  sqliteservices.c \
  main.cpp \
  login.cpp \
  ...

headers = \
  chorusclient.h \
  sqliteservices.h \
  login.h \
  ...

Однако любой, кто сделал это, должен сначала разработать код C с предположениями, что он будет скомпилирован и выполненв среде C ++.В противном случае вы получите много ошибок компиляции и много переписывания.

Это относится только к интерфейсу, то есть к заголовкам.Если ваши заголовки имеют правильный чистый C, они будут также чистым C ++.В противном случае - у вас был беспорядок, и C ++ только заставил вас убрать его.

...