Qt运行C ++和C代码

时间:2018-05-19 19:28:47

标签: c++ c qt qt-creator

我有一个1.5年前为客户开发的嵌入式物联网应用程序。该应用程序非常庞大,用C语言编写。它继续正常工作。

客户要求我添加HDMI触摸显示屏以及一些复杂的图形。我选择Qt作为图形框架。 Qt很棒,但它是用C ++编写的。不想将C代码重写为C ++,我将C代码重构为可调用方法或服务的集合。

是的,我知道C应该在C ++中正确编译和执行。但是,任何完成此操作的人必须首先开发C代码,并假设它将在C ++环境中编译和执行。否则会出现很多编译错误和大量重写。

我创建了所有C ++类和C服务。我首先使用gcc编译C代码并创建c-object.o文件。我在我的c代码头文件中使用了以下内容:

#ifdef __cplusplus
extern "C" {
#endif

我首先编译C代码并生成c-object.o。看起来很疯狂,我使用Qt creator生成.pro文件,使用qmake生成Makefile并生成编译和链接。

我遇到各种链接错误,因为Makefile没有引用C代码。但是,将所有g ++命令输出到显示器。我只需将最后一个make g ++命令复制并粘贴到记事本,该命令链接所有cpp-object.o文件 - 创建所有链接“未找到对象引用”错误的文件。然后我复制并粘贴到g ++命令中记录c-object.o文件名和库名。我重新运行修改后的g ++命令,一切正常。 chorusclient.o是c-object。

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 :(得分:2)

我不知道你为什么要这么做。 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 ++只会强迫你清理它。