使用QT在ubuntu上的共享库(没有main)中运行QApplication

时间:2017-09-29 10:26:20

标签: c++ qt

我需要编写一个共享库(将静态库连接到软件)。静态库是一个基于QWizardPage的项目,旨在在软件运行时创建未来的接口。

静态库: 的.pro

#-------------------------------------------------
#
# Project created by QtCreator 2017-09-29T01:12:06
#
#-------------------------------------------------

QT       += widgets

TARGET = FutureInterface
TEMPLATE = lib
CONFIG += staticlib

SOURCES += futureinterface.cpp

HEADERS += futureinterface.h
unix {
    target.path = /usr/lib
    INSTALLS += target
}

FORMS += \
    futureinterface.ui

·H

#ifndef FUTUREINTERFACE_H
#define FUTUREINTERFACE_H

#include <QWizardPage>

namespace Ui {
    class FutureInterface;
}

class FutureInterface : public QWizardPage
{
    Q_OBJECT

public:
    explicit FutureInterface(QWidget *parent = 0);
    ~FutureInterface();

private slots:
    void on_pushButton_clicked();

private:
    Ui::FutureInterface *ui;
};

#endif // FUTUREINTERFACE_H

的.cpp

#include "futureinterface.h"
#include "ui_futureinterface.h"

FutureInterface::FutureInterface(QWidget *parent) :
    QWizardPage(parent),
    ui(new Ui::FutureInterface)
{
    ui->setupUi(this);
}

FutureInterface::~FutureInterface()
{
    delete ui;
}

void FutureInterface::on_pushButton_clicked()
{

}

我需要在以下函数中在共享库中运行FutureInterface。

共享库的整个代码:

#include "v_repExtQuadRotor.h"
#include "scriptFunctionData.h"
#include <iostream>
#include "v_repLib.h"
#include <eigen3/Eigen/Dense>
#include "FutureInterface/futureinterface.h"
#include <QApplication>

typedef Eigen::Matrix<float, 7, 1> vector7f;
typedef Eigen::Matrix<float, 6, 1> vector6f;
typedef Eigen::Matrix<float, 4, 1> vector4f;
typedef Eigen::Matrix<float, 6, 6> matrix66f;

#ifdef _WIN32
    #ifdef QT_COMPIL
        #include <direct.h>
    #else
        #include <shlwapi.h>
        #pragma comment(lib, "Shlwapi.lib")
    #endif
#endif /* _WIN32 */
#if defined (__linux) || defined (__APPLE__)
    #include <unistd.h>
    #define WIN_AFX_MANAGE_STATE
#endif /* __linux || __APPLE__ */

#define CONCAT(x,y,z) x y z
#define strConCat(x,y,z)    CONCAT(x,y,z)

#define PLUGIN_NAME "QuadRotor"

LIBRARY vrepLib;

struct sQuadRotor
{
    int motorHandles[4];
    vector4f jointVelocity;
    vector6f sensorData;
};
std::vector<sQuadRotor> allQuadRotors;
void app(){
    int argc = 1;
    char appname[] = "App";
    char* argv[] = {appname, NULL};
    QApplication a(argc, argv);
    FutureInterface w;
    w.show();
    int i=a.exec();
}

// --------------------------------------------------------------------------------------
// simExtQuadRotor_create
// --------------------------------------------------------------------------------------
#define LUA_CREATE_QRCOMMAND "simExtQuadRotor_create"

const int inArgs_QRCREATE[]={

    1,
    sim_script_arg_int32|sim_script_arg_table,4,
};

void LUA_CREATE_QRCALLBACK(SScriptCallBack* cb)
{
    allQuadRotors.clear();
    CScriptFunctionData D;
    if (D.readDataFromStack(cb->stackID,inArgs_QRCREATE,inArgs_QRCREATE[0],LUA_CREATE_QRCOMMAND))
    {
        std::vector<CScriptFunctionDataItem>* inData=D.getInDataPtr();
        sQuadRotor QuadRotor;
        for(int n=0;n<4;n++){
            QuadRotor.motorHandles[n]=inData->at(0).int32Data[n];
        }
        QuadRotor.jointVelocity<<Eigen::VectorXf::Zero(4);
        QuadRotor.sensorData<<Eigen::VectorXf::Zero(6);
        allQuadRotors.push_back(QuadRotor);
    }
    D.pushOutData(CScriptFunctionDataItem(1));
    D.writeDataToStack(cb->stackID);
}

// --------------------------------------------------------------------------------------



VREP_DLLEXPORT unsigned char v_repStart(void* reservedPointer,int reservedInt)
{ // This is called just once, at the start of V-REP.
    // Dynamically load and bind V-REP functions:
    char curDirAndFile[1024];
#ifdef _WIN32
    #ifdef QT_COMPIL
        _getcwd(curDirAndFile, sizeof(curDirAndFile));
    #else
        GetModuleFileName(NULL,curDirAndFile,1023);
        PathRemoveFileSpec(curDirAndFile);
    #endif
#elif defined (__linux) || defined (__APPLE__)
    getcwd(curDirAndFile, sizeof(curDirAndFile));
#endif
    std::string currentDirAndPath(curDirAndFile);
    std::string temp(currentDirAndPath);

#ifdef _WIN32
    temp+="\\v_rep.dll";
#elif defined (__linux)
    temp+="/libv_rep.so";
#elif defined (__APPLE__)
    temp+="/libv_rep.dylib";
#endif /* __linux || __APPLE__ */

    vrepLib=loadVrepLibrary(temp.c_str());
    if (vrepLib==NULL)
    {
        std::cout << "Error, could not find or correctly load v_rep.dll. Cannot start 'QuadRotor' plugin.\n";
        return(0); // Means error, V-REP will unload this plugin
    }
    if (getVrepProcAddresses(vrepLib)==0)
    {
        std::cout << "Error, could not find all required functions in v_rep.dll. Cannot start 'QuadRotor' plugin.\n";
        unloadVrepLibrary(vrepLib);
        return(0); // Means error, V-REP will unload this plugin
    }

    // Check the V-REP version:
    int vrepVer;
    simGetIntegerParameter(sim_intparam_program_version,&vrepVer);
    if (vrepVer<30200) // if V-REP version is smaller than 3.02.00
    {
        std::cout << "Sorry, your V-REP copy is somewhat old, V-REP 3.2.0 or higher is required. Cannot start 'QuadRotor' plugin.\n";
        unloadVrepLibrary(vrepLib);
        return(0); // Means error, V-REP will unload this plugin
    }

    // Register 4 new Lua commands:
    simRegisterScriptCallbackFunction(strConCat(LUA_CREATE_QRCOMMAND,"@",PLUGIN_NAME),strConCat("number QuadRotorHandle=",LUA_CREATE_QRCOMMAND,"(table_4 JointHandles)"),LUA_CREATE_QRCALLBACK);

    return(8); // initialization went fine, we return the version number of this plugin (can be queried with simGetModuleName)
    // version 1 was for V-REP versions before V-REP 2.5.12
    // version 2 was for V-REP versions before V-REP 2.6.0
    // version 5 was for V-REP versions before V-REP 3.1.0 
    // version 6 is for V-REP versions after V-REP 3.1.3
    // version 7 is for V-REP versions after V-REP 3.2.0 (completely rewritten)
    // version 8 is for V-REP versions after V-REP 3.3.0 (using stacks for data exchange with scripts)
}

VREP_DLLEXPORT void v_repEnd()
{ // This is called just once, at the end of V-REP
    unloadVrepLibrary(vrepLib); // release the library
}

VREP_DLLEXPORT void* v_repMessage(int message,int* auxiliaryData,void* customData,int* replyData)
{ // This is called quite often. Just watch out for messages/events you want to handle
    // This function should not generate any error messages:
    int errorModeSaved;
    simGetIntegerParameter(sim_intparam_error_report_mode,&errorModeSaved);
    simSetIntegerParameter(sim_intparam_error_report_mode,sim_api_errormessage_ignore);
    void* retVal=NULL;
    if (message==sim_message_eventcallback_modulehandle)
    {
        if ( (customData==NULL)||(std::string("QuadRotor").compare((char*)customData)==0) ) // is the command also meant for QuadRotor?
        {
          if(allQuadRotors.size()>0){
              //controller***********************************************************************************
              app();

          }
        }
    }

    if (message==sim_message_eventcallback_simulationended)
    { // simulation ended. Destroy all QuadRotor instances:
        allQuadRotors.clear();
    }

    simSetIntegerParameter(sim_intparam_error_report_mode,errorModeSaved); // restore previous settings
    return(retVal);
}

我是否需要安装某些软件包或某些依赖项?因为,现在我的软件无法加载共享库。似乎该软件无法找到QWizardPage依赖项。你能告诉我我的烂摊子吗?非常感谢

似乎软件无法加载它,因为我使用QApplication在共享库中执行静态库?

在共享库中使用QApplication是错误的吗?我应该做点什么吗?

1 个答案:

答案 0 :(得分:0)

问题是由于QT的版本。该软件以不同的QT版本实现,与我试图实现我的代码的版本相反。

相关问题