如何执行此DirectFB示例?

时间:2013-01-16 17:47:11

标签: c++ g++ directfb

我从tutorials获得了以下directFB示例代码:

#include <stdio.h>
#include <unistd.h>

#include <directfb/directfb.h>

static IDirectFB *dfb = NULL;
static IDirectFBSurface *primary = NULL;
static int screen_width = 0;
static int screen_height = 0;
#define DFBCHECK(x...)                                         \
  {                                                            \
    DFBResult err = x;                                         \
                                                               \
    if (err != DFB_OK)                                         \
      {                                                        \
        fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
        DirectFBErrorFatal( #x, err );                         \
      }                                                        \
  }
int main(int argc, char **argv) {

    DFBSurfaceDescription dsc;
    DFBCHECK(DirectFBInit (&argc, &argv));
    DFBCHECK(DirectFBCreate (&dfb));
    DFBCHECK(dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));
    dsc.flags = DSDESC_CAPS;
    dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING;
    DFBCHECK(dfb->CreateSurface( dfb, &dsc, &primary ));
    DFBCHECK(primary->GetSize (primary, &screen_width, &screen_height));
    DFBCHECK(primary->FillRectangle (primary, 0, 0, screen_width, screen_height));
    DFBCHECK(primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff));
    DFBCHECK(primary->DrawLine (primary, 0, screen_height / 2, screen_width - 1, screen_height / 2));
    DFBCHECK(primary->Flip (primary, NULL, 0));
    sleep(5);
    primary->Release(primary);
    dfb->Release(dfb);
    return 23;
}

我正在尝试编译并得到错误(来自gnome-terminal):

$ g++ Test01HorizontalLine.cpp -I /usr/local/include/directfb/
Test01HorizontalLine.cpp: In function ‘int main(int, char**)’:
Test01HorizontalLine.cpp:27: error: invalid conversion from ‘int’ to ‘DFBSurfaceCapabilities’
Test01HorizontalLine.cpp:33: error: invalid conversion from ‘int’ to ‘DFBSurfaceFlipFlags’

我正在使用DFB 1.4.11(我无法更新我当前的项目)。如何运行此示例? (新手)

- 更新

更新后的行(如@jclin所述):

dsc.caps = DFBSurfaceCapabilities(DSCAPS_PRIMARY | DSCAPS_FLIPPING);  
...  
primary->Flip(primary, NULL, DFBSurfaceFlipFlags(0));  

结果是:

$ g++ Test01HorizontalLine.cpp -I /usr/local/include/directfb/
/tmp/cc6iUS1W.o: In function `main':
Test01HorizontalLine.cpp:(.text+0x1c): undefined reference to `DirectFBInit'
Test01HorizontalLine.cpp:(.text+0x61): undefined reference to `DirectFBErrorFatal'
Test01HorizontalLine.cpp:(.text+0x6d): undefined reference to `DirectFBCreate'
Test01HorizontalLine.cpp:(.text+0xb2): undefined reference to `DirectFBErrorFatal'
Test01HorizontalLine.cpp:(.text+0x111): undefined reference to `DirectFBErrorFatal'
Test01HorizontalLine.cpp:(.text+0x188): undefined reference to `DirectFBErrorFatal'
Test01HorizontalLine.cpp:(.text+0x1ef): undefined reference to `DirectFBErrorFatal'
Test01HorizontalLine.cpp:(.text+0x26d): undefined reference to `DirectFBErrorFatal'
/tmp/cc6iUS1W.o:Test01HorizontalLine.cpp:(.text+0x2e4): more undefined references to `DirectFBErrorFatal' follow
collect2: ld returned 1 exit status

3 个答案:

答案 0 :(得分:4)

下面的代码适用于我的测试ubuntu12,我可能和你有不同的directfb,但应该是相似的:

#include <stdio.h>
#include <unistd.h>

#include <directfb/directfb.h>

static IDirectFB *dfb = NULL;
static IDirectFBSurface *primary = NULL;
static int screen_width = 0;
static int screen_height = 0;
#define DFBCHECK(x...)                                         \
  {                                                            \
    DFBResult err = x;                                         \
                                                               \
    if (err != DFB_OK)                                         \
      {                                                        \
        fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
        DirectFBErrorFatal( #x, err );                         \
      }                                                        \
  }
int main(int argc, char **argv) {

    DFBSurfaceDescription dsc;
    DFBCHECK(DirectFBInit (&argc, &argv));
    DFBCHECK(DirectFBCreate (&dfb));
    DFBCHECK(dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));
    dsc.flags = DSDESC_CAPS;
    dsc.caps = DFBSurfaceCapabilities(DSCAPS_PRIMARY | DSCAPS_FLIPPING);
    DFBCHECK(dfb->CreateSurface( dfb, &dsc, &primary ));
    DFBCHECK(primary->GetSize (primary, &screen_width, &screen_height));
    DFBCHECK(primary->FillRectangle (primary, 0, 0, screen_width, screen_height));
    DFBCHECK(primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff));
    DFBCHECK(primary->DrawLine (primary, 0, screen_height / 2, screen_width - 1, screen_height / 2));
    primary->Flip(primary, NULL, DFBSurfaceFlipFlags(0));
    sleep(5);
    primary->Release(primary);
    dfb->Release(dfb);
    return 23;
}

使用以下命令行构建:

 g++ -o testHorizonLine  Test01HorizontalLine.cpp -I/usr/include \
 -I/usr/include/directfb -L/usr/lib/i386-linux-gnu -ldirectfb

要查找libdirectfb.so所在的位置,可以使用linux find命令,然后将-L选项添加到g ++命令以包含库路径,并添加-ldirectfb以链接libdirectfb.so文件。

$ find /usr/lib -name libdirectfb.so   

运行testhorizo​​nLine输出:

   ~~~~~~~~~~~~~~~~~~~~~~~~~~| DirectFB 1.2.10 |~~~~~~~~~~~~~~~~~~~~~~~~~~
        (c) 2001-2008  The world wide DirectFB Open Source Community
        (c) 2000-2004  Convergence (integrated media) GmbH
      ----------------------------------------------------------------

(*) DirectFB/Core: Single Application Core. (2012-05-21 06:43)
(!) Direct/Util: opening '/dev/fb0' failed
    --> Permission denied
(!) DirectFB/FBDev: Error opening framebuffer device!
(!) DirectFB/FBDev: Use 'fbdev' option or set FRAMEBUFFER environment variable.
(!) DirectFB/Core: Could not initialize 'system_core' core!
    --> Initialization error!
Test01HorizontalLine.cpp <24>:
        (#) DirectFBError [DirectFBCreate (&dfb)]: Initialization error!

答案 1 :(得分:3)

你可以试试这个,因为我现在没有这样的版本。

dsc.caps = DFBSurfaceCapabilities(DSCAPS_PRIMARY | DSCAPS_FLIPPING);  
...  
primary->Flip(primary, NULL, DFBSurfaceFlipFlags(0));  

答案 2 :(得分:3)

如果您在项目中使用库,包括标题只是工作的一半。您还必须显示实际库(在您的情况下为 libdirectfb.so )所在的位置,以便它可以链接到您的代码。通过传递 -L -l <​​/ strong>选项(也注意,既不需要lib-也不是externsion .so)来执行此操作:

g++ your_source_file.cpp -I /path/to/include -L/path/to/lib -ldirectfb

有很多关于如何在项目中使用库的主题,即您可能想要启动herehere

P.S。使用 -Wall 选项查看有关正在发生的事情的更多信息始终是个好主意。