Qt运行C++和C代码

3

我有一个嵌入式物联网应用程序,是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,再用make编译和链接。
由于Makefile没有引用C代码,我遇到了各种链接错误。不过,make会将所有g++命令输出到显示器上。我只需复制并粘贴最后一个make g++命令,它将链接所有cpp-object.o文件——也就是创建所有链接“对象引用未找到”错误的命令。然后,我将c-object.o文件名和库名复制并粘贴到g++命令中。重新运行修改后的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个回答

3

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

我同意,这是一个让编译正确的非常奇怪的方式。让事情正常工作是发明创造的母亲!我在调用c-code服务的Qt类中包含了c-code.h文件。由于某种原因,QT creator或qmake没有捕捉到“#include"chorusclient.h"”。就像我说的,我可以复制并粘贴g++命令行,然后使其编译和链接正确。没有魔法,只有正确的目标文件和必要的库名称。在Qt中,是否需要特殊操作才能让qmake识别c-code?我对qmake不是太熟悉。 - skmansfield
2
一种非常奇怪的方法可以使其正确编译。停止。忘记你到目前为止所做的一切。打开Qt项目的.pro文件。将.c.h文件添加到SOURCESHEADERS中。完成了。请不要把它复杂化。参见编辑。 - Kuba hasn't forgotten Monica
工作得很好。虽然在我的问题陈述中不太明显,但我还必须在.pro文件中包含库,包括INCLUDEPATH += -L/usr/include \ LIBS += -lssl \ LIBS += -lcrypto \ LIBS += -ljson-c。 - skmansfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接