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





Понятия не имею, зачем вы все это делаете. 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++ только заставил вас его убрать.
.pro для проекта Qt. Добавьте файлы .c и .h к SOURCES и HEADERS. Вы сделали. Пожалуйста, не усложняйте это больше. Смотрите редактирование.
Сработало отлично. Хотя это не очевидно в моей формулировке проблемы, мне также пришлось включить библиотеки в файл .pro, INCLUDEPATH + = -L / usr / include \ LIBS + = -lssl \ LIBS + = -lcrypto \ LIBS + = -ljson- c.
Я согласен, очень странный способ правильно скомпилировать. Приведение вещей к работе - мать всех изобретений! Я действительно включил файл c-code.h в класс Qt, который вызывает сервисы c-кода. По какой-то причине создатель QT или qmake не выбирает "#include" chorusclient.h ". Как я уже сказал, я могу вырезать и вставить командные строки g ++ и заставить его правильно скомпилировать и связать. Никакой магии, только правильные объектные файлы и необходимые имена библиотек. Есть ли что-то особенное в Qt, чтобы заставить qmake распознавать c-код? Я не так хорошо знаком с qmake.