Я получил следующий пример кода 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-терминала):
$ 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
Можете ли вы попробовать это, потому что у меня сейчас нет такой версии.
dsc.caps = DFBSurfaceCapabilities(DSCAPS_PRIMARY | DSCAPS_FLIPPING);
...
primary->Flip(primary, NULL, DFBSurfaceFlipFlags(0));
Ниже код работает на моем тесте 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
Запустите вывод testhorizonLine:
~~~~~~~~~~~~~~~~~~~~~~~~~~| 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!
В случае, если вы используете библиотеки в своем проекте, в том числе заголовки это только половина работы. Вы также должны показать, где фактическая библиотека (libdirectfb.so в вашем случае) расположен так, что он может быть связан с вашим кодом. Сделайте это, передав -L а также -L варианты (также нота что ни префикс lib-, ни externsion .so не требуется):
g++ your_source_file.cpp -I /path/to/include -L/path/to/lib -ldirectfb
Есть много тем о том, как использовать библиотеки в своих проектах, то есть вы можете начать Вот а также Вот
Постскриптум Это всегда хорошая идея для использования -стена возможность увидеть больше информации о том, что происходит.