Qt с кодом C++ и C

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 538
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Понятия не имею, зачем вы все это делаете. 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 \
  ...

However, anyone who has done that must first develop the C code with the assumptions that it will be compiled and executed in a C++ environment. Otherwise you get lots of compile errors and a lot of rewriting.

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

Я согласен, очень странный способ правильно скомпилировать. Приведение вещей к работе - мать всех изобретений! Я действительно включил файл c-code.h в класс Qt, который вызывает сервисы c-кода. По какой-то причине создатель QT или qmake не выбирает "#include" chorusclient.h ". Как я уже сказал, я могу вырезать и вставить командные строки g ++ и заставить его правильно скомпилировать и связать. Никакой магии, только правильные объектные файлы и необходимые имена библиотек. Есть ли что-то особенное в Qt, чтобы заставить qmake распознавать c-код? Я не так хорошо знаком с qmake.

skmansfield 19.05.2018 23:12
очень странный способ правильно скомпилироватьОСТАНАВЛИВАТЬСЯ. Забудьте все, что вы делали до этого момента. Откройте файл .pro для проекта Qt. Добавьте файлы .c и .h к SOURCES и HEADERS. Вы сделали. Пожалуйста, не усложняйте это больше. Смотрите редактирование.
Kuba hasn't forgotten Monica 20.05.2018 01:34

Сработало отлично. Хотя это не очевидно в моей формулировке проблемы, мне также пришлось включить библиотеки в файл .pro, INCLUDEPATH + = -L / usr / include \ LIBS + = -lssl \ LIBS + = -lcrypto \ LIBS + = -ljson- c.

skmansfield 01.06.2018 04:22

Другие вопросы по теме