【问题标题】:Qt running C++ and C codeQt 运行 C++ 和 C 代码
【发布时间】:2018-10-29 22:10:58
【问题描述】:

我有一个 1.5 年前为客户开发的嵌入式 IoT 应用程序。该应用程序很大,并且是用 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++ 命令输出到显示器。我只是将链接所有 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 代码并正确编译和链接?至少可以说,剪切、粘贴和重新链接很尴尬!

【问题讨论】:

    标签: c++ c qt qt-creator


    【解决方案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 \
      ...
    

    但是,任何这样做的人都必须首先开发 C 代码,并假设它将在 C++ 环境中编译和执行。否则你会得到很多编译错误和大量重写。

    这仅适用于接口,即标题。如果您的标头是正确的干净 C,那么它们也将是干净的 C++。否则 - 你把自己弄得一团糟,而 C++ 只会强迫你清理它。

    【讨论】:

    • 我同意,这是一种非常奇怪的正确编译方式。让东西发挥作用是所有发明之母!我确实在调用 c-code 服务的 Qt 类中包含了 c-code.h 文件。出于某种原因,QT 创建者或 qmake 没有选择“#include”chorusclient.h”。就像我说的,我可以剪切和粘贴 g++ 命令行并让它正确编译和链接。没有魔法,只有正确的目标文件和必要的库名称。我需要在 Qt 中做一些特别的事情来让 qmake 识别 c 代码吗?我对 qmake 不是很熟悉。
    • 一种非常奇怪的方式来让它正确编译 STOP。忘记你到目前为止所做的一切。打开 Qt 项目的 .pro 文件。将.c.h 文件添加到SOURCESHEADERS你已经完成了。请不要再复杂化了。查看编辑。
    • 效果很好。虽然在我的问题陈述中并不明显,但我也必须在 .pro 文件中包含库,INCLUDEPATH += -L/usr/include \ LIBS += -lssl \ LIBS += -lcrypto \ LIBS += -ljson- c.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多