Qt 运行 C++ 和 C 代码
Qt running C++ and C code
我有一个 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 并进行编译,link.
我收到各种 link 错误,因为 Makefile 没有引用 C 代码。但是,make 将其所有 g++ 命令输出到显示器。我只是将最后一个 links 所有 cpp-object.o 文件的 make g++ 命令复制并粘贴到记事本——创建所有 link "object reference not found" 错误的命令.然后,我将 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 代码并正确编译 link?剪切、粘贴和重新 linking 至少可以说是尴尬的!
我不知道你为什么要做这些。 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.
这仅适用于接口,即 headers。如果您的 headers 是正确的干净 C,它们也将是干净的 C++。否则 - 你把自己弄得一团糟,而 C++ 只是强迫你清理它。
我有一个 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 并进行编译,link.
我收到各种 link 错误,因为 Makefile 没有引用 C 代码。但是,make 将其所有 g++ 命令输出到显示器。我只是将最后一个 links 所有 cpp-object.o 文件的 make g++ 命令复制并粘贴到记事本——创建所有 link "object reference not found" 错误的命令.然后,我将 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 代码并正确编译 link?剪切、粘贴和重新 linking 至少可以说是尴尬的!
我不知道你为什么要做这些。 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.
这仅适用于接口,即 headers。如果您的 headers 是正确的干净 C,它们也将是干净的 C++。否则 - 你把自己弄得一团糟,而 C++ 只是强迫你清理它。