我有一个1.5年前为客户开发的嵌入式IoT应用程序。该应用程序非常大,用C编写。它仍然可以正常工作。
客户要求我添加HDMI触摸屏以及一些复杂的图形。我选择了Qt作为图形框架。 Qt很棒,但是它是用C++编写的。不想将C代码重写为C++,我将C代码重构为可调用方法或服务的集合。
是的,我知道C应该可以在C++中正确编译和执行。但是,任何这样做的人必须首先开发C代码,并假设它将在C++环境中编译和执行。否则会出现很多编译错误和大量重写。
我创建了所有C++类和C服务。我首先使用gcc编译C代码并创建c-object.o文件。我在C代 jetty 文件中使用了以下内容:
#ifdef __cplusplus
extern "C" {
#endif
我首先编译C代码并生成c-object.o。看起来很疯狂,我使用Qt创建器生成.pro文件,使用qmake生成Makefile并进行编译和链接。
我收到各种链接错误,因为Makefile没有引用C代码。但是,将其所有g++命令输出到显示器。我只是将链接所有cpp-object.o文件的最后一个make g++命令复制并粘贴到记事本中,该命令将创建所有链接“找不到对象引用”错误。然后,我将g++命令中的c-object.o文件名和库名复制并粘贴到记事本中。我重新运行修改后的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 \
...
这仅适用于接口(interface),即报头。如果您的 header 是正确的纯净C语言,那么它们也将是纯净C++语言。否则,您会陷入困惑,而C++只会迫使您对其进行清理。