c++ - 如何使用 Qt 类编译 rpcgen 文件?

标签 c++ c qt5 rpc qmake

我正在做一项作业,我们必须使用 RPCgen 生成的服务器和客户端 .c 文件来交换有关共享绘图板的信息。绘图板是使用 QtCreator 和 QtPainter 实现的。

我遇到的问题是,在编译时,我得到了对 xdr_int 等 xdr 函数和我在 QtCreator 中创建的与 xdr 相关的类文件中的函数的 undefined reference 错误。我认为值得一提的是,客户端/服务器独立代码在 -ltirpc 标志下运行良好。

我已经尝试过直接在 .pro + qmake 生成的 makefile 中添加 -ltirpc 标志,并且只在 pro 中添加。文件,然后通过 QtCreator 运行。下面的 LineArea 函数是 undefined reference 之一,它创建客户端的第一行是对 xdr 函数 clnt_create 的引用。

LineArea::LineArea(char *hostname, QWidget *parent) : QWidget(parent)
{
    clnt = clnt_create(hostname, WHITEBOARD_PROG, WHITEBOARD_VERSION, "udp");
    if (clnt)
    {
        clnt_info = register_client_1(clnt_info, clnt);
        setAttribute(Qt::WA_StaticContents);
        press_start = false;
        pen_width = 2;
        pen_color = QColor(clnt_info->r, clnt_info->g, clnt_info->b);
        board = QImage(500, 500, QImage::Format_RGB32);
        board.fill(qRgb(255, 255, 255));
        board_real = board;
        update();
    }
}

这是将编译标志添加到 qmake/.pro 的最新尝试:

CONFIG += c++11

SOURCES += \
        LineArea.cpp \
        main.cpp \
        mainwindow.cpp \
        whiteboard_clnt.c \
        whiteboard_xdr.c

HEADERS += \
        LineArea.h \
        mainwindow.h \
        whiteboard.h

FORMS += \
        mainwindow.ui
#EXTRA FLAGS
QMAKE_CXXFLAGS += -ltirpc

如有任何帮助或建议,我们将不胜感激。

编辑:这些是编译时的错误

g++ -Wl,-O1 -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -o whiteboard LineArea.o main.o mainwindow.o moc_LineArea.o moc_mainwindow.o whiteboard_clnt.c whiteboard_xdr.c whiteboard.h   /usr/lib/libQt5Widgets.so /usr/lib/libQt5Gui.so /usr/lib/libQt5Core.so /usr/lib/libGL.so -lpthread   
/usr/bin/ld: LineArea.o: in function `LineArea::LineArea(char*, QWidget*)':
LineArea.cpp:(.text+0xa6f): undefined reference to `clnt_create'
/usr/bin/ld: /tmp/ccdM1OwC.o: in function `send_line_1':
whiteboard_clnt.c:(.text+0x43): undefined reference to `xdr_int'
/usr/bin/ld: /tmp/ccdM1OwC.o: in function `remove_client_1':
whiteboard_clnt.c:(.text+0x1cf): undefined reference to `xdr_int'
/usr/bin/ld: /tmp/cccxQLHU.o: in function `xdr_operands':
whiteboard_xdr.c:(.text+0x54): undefined reference to `xdr_int'
/usr/bin/ld: whiteboard_xdr.c:(.text+0x7e): undefined reference to `xdr_int'
/usr/bin/ld: whiteboard_xdr.c:(.text+0xa8): undefined reference to `xdr_int'
/usr/bin/ld: /tmp/cccxQLHU.o:whiteboard_xdr.c:(.text+0xd2): more undefined references to `xdr_int' follow
collect2: error: ld returned 1 exit status
make: *** [Makefile:410: whiteboard] Error 1

我正在手动运行 make,我已将 whiteboard_clnt.c whiteboard_xdr.c 和 whiteboard.h 添加到 makefile 的配方中。如果没有它们,则会出现相同的错误,除了 xdr 错误。

g++ -Wl,-O1 -Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now -o whiteboard LineArea.o main.o mainwindow.o moc_LineArea.o moc_mainwindow.o   /usr/lib/libQt5Widgets.so /usr/lib/libQt5Gui.so /usr/lib/libQt5Core.so /usr/lib/libGL.so -lpthread   
/usr/bin/ld: LineArea.o: in function `LineArea::recvLines()':
LineArea.cpp:(.text+0x70): undefined reference to `consult_line_1'
/usr/bin/ld: LineArea.o: in function `LineArea::drawLineTo(QPoint const&)':
LineArea.cpp:(.text+0x7a0): undefined reference to `send_line_1'
/usr/bin/ld: LineArea.o: in function `LineArea::LineArea(char*, QWidget*)':
LineArea.cpp:(.text+0xa6f): undefined reference to `clnt_create'
/usr/bin/ld: LineArea.cpp:(.text+0xa86): undefined reference to `register_client_1'
collect2: error: ld returned 1 exit status
make: *** [Makefile:410: whiteboard] Error 1

最佳答案

QMAKE_CXXFLAGS += -ltirpc 添加编译器标志,编译器不关心库。假设 lib 名称是正确的并且在没有添加 -L 库搜索路径的情况下找到,这应该可以工作:

LIBS += -ltirrp 

关于c++ - 如何使用 Qt 类编译 rpcgen 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58185137/

相关文章:

c++ - 如何在 C++ 中有效地返回树中的节点列表

c++ - 如何使用 C++ 在记事本++ 中打开文件?

C99:静态库中的动态调度

c++ - 关于内存管理的 Qt5 元素的正确使用

c++ - 序列化具有不同成员的继承类 MFC c++

c++ - C++ float 是否保证有无穷大?

c++ - 将 cmake 项目与 Qt5 链接时部署 icu 库

c++ - QML 模型数据(按索引)

ios - 'tm' 的定义必须在需要之前从模块 'Darwin.C.time' 导入

c - 使用与用 nasm 组装的对象链接的 matlab 混合 C 代码时出错