Правильное связывание библиотек graphviz с C ++ - PullRequest
0 голосов
/ 03 октября 2018

Я разрабатываю программу с QtCreator, в которой я использую graphviz2.38.

Я сделал минимальный пример для объяснения.Просто рассмотрите этот небольшой код, который преобразует файл точек в SVG-файл:

#include <QCoreApplication>
#include <graphviz/gvc.h>
#include <graphviz/gvplugin.h>
#include <graphviz/cgraph.h>
#include <graphviz/cdt.h>
#include<iostream>
using namespace std;

void saveImageGV(){

    GVC_t *gvc= gvContext();
    extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
    gvAddLibrary(gvc, &gvplugin_dot_layout_LTX_library);
    FILE *fp = fopen(("ancestry.dot"), "r");
    Agraph_t *g = agread(fp,0);
    gvLayout(gvc, g, "dot");
    gvRender(gvc, g, "svg", fopen(("ancestry.svg"), "w"));
    gvFreeLayout(gvc, g);
    agclose(g);
    (gvFreeContext(gvc));
    return exit(0);
}


int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    saveImageGV();
    return a.exec();
}

Параметры компиляции следующие:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport


SOURCES += \
        main.cpp
QMAKE_LFLAGS += "-Wl,--rpath=lib/ "
QMAKE_LFLAGS += "-Wl,--dynamic-linker=lib/ld-linux-x86-64.so.2"

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
INCLUDEPATH += /usr/local/include/graphviz/

unix:!macx: LIBS += -L$$PWD/../../../../usr/lib/ -lcdt
INCLUDEPATH += $$PWD/../../../../usr/lib
DEPENDPATH += $$PWD/../../../../usr/lib

unix:!macx: LIBS += -L$$PWD/../../../../usr/lib/ -lcgraph
INCLUDEPATH += $$PWD/../../../../usr/lib
DEPENDPATH += $$PWD/../../../../usr/lib

unix:!macx: LIBS += -L$$PWD/../../../../usr/lib/ -lgvc
INCLUDEPATH += $$PWD/../../../../usr/lib
DEPENDPATH += $$PWD/../../../../usr/lib

unix:!macx: LIBS += -L$$PWD/../../../usr/lib/graphviz/ -lgvplugin_dot_layout
INCLUDEPATH += $$PWD/../../../usr/lib/graphviz
DEPENDPATH += $$PWD/../../../usr/lib/graphviz

unix:!macx: LIBS += -L$$PWD/../../../usr/lib/graphviz/ -lgvplugin_core
INCLUDEPATH += $$PWD/../../../usr/lib/graphviz
DEPENDPATH += $$PWD/../../../usr/lib/graphviz

unix:!macx: LIBS += -L$$PWD/../../../../usr/lib/ -lpathplan
INCLUDEPATH += $$PWD/../../../../usr/lib
DEPENDPATH += $$PWD/../../../../usr/lib

unix:!macx: LIBS += -L$$PWD/../../../../usr/lib/ -lxdot
INCLUDEPATH += $$PWD/../../../../usr/lib
DEPENDPATH += $$PWD/../../../../usr/lib

Я также предоставлю вам пример кода GraphViz точка, еслитребуется для ancestry.dot:

graph {
    a -- b;
    b -- c;
    a -- c;
    d -- c;
    e -- c;
    e -- a;
}

В моей папке lib есть следующие библиотеки:

ld-linux-x86-64.so.2  libc.so.6              libgvplugin_dot_layout.so.6  libxdot.so.4
libcdt.so.5           libgvc.so.6            libgvplugin_gd.so.6
libcgraph.so.6        libgvplugin_core.so.6  libpathplan.so.4

Чтобы загрузить эти библиотеки во время выполнения, я использую следующий скрипт:

#!/bin/sh
appname=`basename $0 | sed s,\.sh$,,`

dirname=`pwd`
lib=/lib/

chmod +x $dirname/$appname

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$dirname$lib
echo $LD_LIBRARY_PATH

./$appname "$@"

Когда я выполняю свой код, я получаю ошибку сегментации ... Любое представление о том, что происходит?

...