c++ creator下载 - 从命令行编译Qt项目




creator官网 qt下载地址 (4)

我正在使用Qt(C ++库/框架)开发一个应用程序。 使用QT-Creator我可以很好地编译我的项目,构建目录可以很好地生成所需的可执行文件。 但是,我正在尝试自动化我的问题并使用Apache ANT。 但我遇到了以下问题。

以下是命令行的输出:

build.mac.64:
     [echo] Building for Mac
     [echo] Updating destination path
     [exec] Project WARNING: No .qmake.cache is present. This significantly slows down qmake with this makespec.
     [exec] Project WARNING: Call 'cache()' in the top-level project file to rectify this problem.
     [exec] make: Nothing to be done for `first'.
     [exec] cp: ./build/mac.64/settings.ini: No such file or directory
     [exec] Result: 1
     [echo] Reverting destination path

我不确定为什么它不编译可执行文件。

以下是我的目标的样子:

<target name="build.mac.64">
    <echo>Building for Mac</echo>
    <exec executable="qmake">
        <arg value="myproject.pro"/>
        <arg
        value="-r"/>
        <arg value="-spec"/>
        <arg value="macx-clang"/>
        <arg value="CONFIG+=x86_64"/>
    </exec>

    <exec executable="make" />

    <exec executable="cp">
        <arg value="./settings.ini"/>
        <arg value="${default.build.dir.mac.64}/settings.ini"/>
    </exec>

</target>

知道我哪里错了吗?


Answers

在终端窗口

  1. cd~ / your_project_folder /
  2. qmake -project
  3. QMAKE
  4. 使

谢谢提醒伙计。 我意识到我做错了什么。 QT-Creator实际上是默默地采取前两个步骤。

  1. 创建构建输出目录
  2. CD到构建输出目录(KEY STEP)
  3. 调用qmake引用.pro文件
  4. 打电话给

因此,我忽略的关键是你必须首先进入构建目录,然后调用qmake,make等...而且如果构建已经编译了文件,则抛出该错误。 我只需要确保清理构建目录以编译所有新鲜的东西。


如果编译现有项目,qmake -project实际上是错误的,请参阅“qmake --help”。

qmake -makefile
make

如果它是一个大型项目,“make -j4”或类似。


您必须做的第一件事是将GUI与数据分开,第二件事是创建一个多线程类。

第1步 - 响应式GUI

我们可以假设您生成的图像包含在TImage的画布中。 您可以在表单中放置一个简单的TTimer,您可以编写如下代码:

if (CurrenData.LastUpdate>CurrentUpdate)
    {
    Image1->Canvas->Draw(0,0,CurrenData.Bitmap);
    CurrentUpdate=Now();
    }

好! 我知道! 有点脏,但它很快而且很简单。重点是:

  1. 您需要在主线程中创建的Object
  2. 只有在需要且安全的情况下才能以您需要的形式复制对象(好的,可能需要更好的保护Bitmap,但为了简洁......)
  3. 对象CurrentData是您生成图像的实际项目,单线程

现在您拥有快速响应的GUI。 如果您的算法速度很慢,刷新速度很慢,但您的用户永远不会认为您的程序已冻结。

第2步 - 多线程

我建议你实现如下的类:

SimpleThread.h

typedef void (__closure *TThreadFunction)(void* Data);

class TSimpleThread : public TThread
{
public:
    TSimpleThread( TThreadFunction _Action,void* _Data = NULL, bool RunNow = true );
    void AbortThread();

    __property Terminated; 

protected:
    TThreadFunction ThreadFunction;
    void*           Data;

private:
    virtual void __fastcall Execute() { ThreadFunction(Data); };
};

SimpleThread.c

TSimpleThread::TSimpleThread( TThreadFunction _Action,void* _Data, bool RunNow)
             : TThread(true), // initialize suspended
               ThreadFunction(_Action), Data(_Data)
{
FreeOnTerminate = false;
if (RunNow) Resume();
}

void TSimpleThread::AbortThread()
{
Suspend(); // Can't kill a running thread
Free();    // Kills thread
}

我们来解释一下。 现在,在您的简单线程类中,您可以创建一个这样的对象:

TSimpleThread *ST;
ST=new TSimpleThread( RefreshFunction,NULL,true);
ST->Resume();

让我们更好地解释一下:现在,在你自己的单片类中,你已经创建了一个线程。 更多: 您在一个单独的线程中引入一个函数(即:RefreshFunction) 。 您的功能范围是相同的,类是相同的,执行是分开的。





c++ qt qt-creator