Как скомпилировать файлы rpcgen с классами Qt? - PullRequest
2 голосов
/ 01 октября 2019

Я работаю над заданием, в котором мы должны использовать сгенерированные RPCgen серверные и клиентские файлы .c для обмена информацией об общей чертежной доске. Чертежная доска была реализована с использованием QtCreator и QtPainter.

Проблема, с которой я столкнулся, заключается в том, что при компиляции я получаю ошибки неопределенных ссылок как на функции xdr, такие как xdr_int, так и на функции в файлах классов, которые я создал внутри QtCreator и связанных с xdr. Я думаю, что стоит сказать, что клиент-серверный код прекрасно работает с флагом -ltirpc.

Я уже пытался добавить флаг -ltirpc как непосредственно в make-файл, сгенерированный .pro + qmake, так итолько в профи. файл, а затем работает через QtCreator. Приведенная ниже функция LineArea является одной из неопределенных ссылок, а первая строка, где она создает клиента, является ссылкой на функцию 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 к рецепту в make-файле. Без них появляются те же ошибки, кроме ошибок 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

1 Ответ

1 голос
/ 01 октября 2019

QMAKE_CXXFLAGS += -ltirpc добавляет флаги компилятора, и компилятору нет дела до библиотек. Предполагая, что имя библиотеки правильное и найдено без добавления -L путей поиска в библиотеке, это должно работать:

LIBS += -ltirrp 
...