WhyCan Forum

本站无需注册,无需积分,无需回复可下载所有资料,如果真的喜欢小站,请您注册之后请至少回复一个帖子激活Id,谢谢支持! 站长QQ: 516333132 (挖坑网/填坑网) admin@whycan.cn

您尚未登录。

#1 2019-03-10 15:42:12

ArcherEmiya
会员
注册时间: 2019-03-10
累计积分: 6

licheepi nano 移植SDL2运行程序报Illegal instruction

按照licheepinaono的指导手册编译好了UBOOT,使用buildroot自带的编译器编译了主线linux和rootfs,将SDL编译好的lib下得文件拷到了nano的跟文件系统、/usr/lib下,交叉编译了一个测试程序,就是初始化一下SDL就退出了。运行的时候提示Illegal instruction,同样编译了helloworld是可以运行的,应该不是编译器问题,文件系统和内核都是用的这个编译器,现在搞不清楚问题出在哪,linux菜鸟一个,请教大神建议。

SDL配置
./configure --prefix=/home/yuan/work/SDL2-2.0.9/SDLlib --disable-video-nanox \
                    --disable-video-qtopia \
            --disable-video-photon \
            --disable-video-direct \
            --disable-video-ggi \
            --disable-video-svga \
            --disable-video-aalib \
            --disable-video-dummy \
            --disable-video-dga \
            --enable-video-fbcon \
            --disable-arts \
            --disable-esd \
            --disable-alsa \
            --disable-video-x11 \
            --disable-nasm \
            --disable-debug \
            --disable-joystick-amigaos \
            --disable-joystick-beos \
            --disable-joystick-bsd \
            --disable-joystick-darwin \
            --disable-joystick-dc \
            --disable-joystick-linux \
            --disable-joystick-macos \
            --disable-joystick-mint \
            --disable-joystick-win32 \
            --disable-joystick \
            --disable-input-tslib \
            --host=arm-none-linux-gnueabi \
            --build=i386

程序编译
arm-none-linux-gnueabi-gcc -I/home/yuan/work/SDL2-2.0.9/SDLlib/include -L/home/yuan/work/SDL2-2.0.9/SDLlib/lib main.c -o main -lSDL2

离线

#2 2019-03-10 15:46:38

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 6,979

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

你用哪个编译器?

离线

#3 2019-03-11 07:57:17

ArcherEmiya
会员
注册时间: 2019-03-10
累计积分: 6

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

回大神,我又检查了一遍编译链工具,发现之前是从buildroot的dl文件夹里面拷出来的arm-none-linux-gnueabi-2014.5,现在我直接换成了buildroot里面output/host下的编译好的工具链,这样编译的程序不再报非法指令了,又出现新问题了,运行显示一张BMP图片的程序,提示初始化失败,没有设备。Could not initialize SDL - No available video device。又不知道问题出在哪边了,唉

离线

#4 2019-03-11 08:23:16

超级萌新
会员
注册时间: 2018-05-04
累计积分: 227

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

你跑的是 buildroot 生成的程序?具体是哪个程序?

离线

#5 2019-03-31 10:00:07

ArcherEmiya
会员
注册时间: 2019-03-10
累计积分: 6

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

超级萌新 说:

你跑的是 buildroot 生成的程序?具体是哪个程序?

不是buildroot生成的程序,是网上找的一段测试程序

#include "SDL2/SDL.h"
#include <stdio.h>

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;

int init();
int loadMedia();
void close();

SDL_Window* gWindow = NULL;
SDL_Surface* gScreenSurface = NULL;
SDL_Surface* gHelloWorld = NULL;

int init()
{
    int success = 1;

    if( SDL_Init( SDL_INIT_VIDEO ) < 0 )
    {
        printf( "SDL could not initialize! SDL_Error: %s\n", SDL_GetError() );
        success = 0;
    }
    else
    {
        gWindow = SDL_CreateWindow( "SDL Tutorial", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
        if( gWindow == NULL )
        {
            printf( "Window could not be created! SDL_Error: %s\n", SDL_GetError() );
            success = 0;
        }
        else
        {
            gScreenSurface = SDL_GetWindowSurface( gWindow );
        }
    }

    return success;
}

int loadMedia()
{
    int success = 1;

    gHelloWorld = SDL_LoadBMP( "/usr/hello_world.bmp" );
    if( gHelloWorld == NULL )
    {
        printf( "Unable to load image %s! SDL Error: %s\n", "hello_world.bmp", SDL_GetError() );
        success = 0;
    }

    return success;
}

void close()
{
    SDL_FreeSurface( gHelloWorld );
    gHelloWorld = NULL;

    SDL_DestroyWindow( gWindow );
    gWindow = NULL;

    SDL_Quit();
}

int main( int argc, char* args[] )
{
    if( !init() )
    {
        printf( "Failed to initialize!\n" );
    }
    else
    {
        if( !loadMedia() )
        {
            printf( "Failed to load media!\n" );
        }
        else
        {
            SDL_BlitSurface( gHelloWorld, NULL, gScreenSurface, NULL );
           
            SDL_UpdateWindowSurface( gWindow );

            SDL_Delay( 2000 );
        }
    }

    close();

    return 0;
}

初始化SDL阶段就报错退出了。我就将交叉编译的SDL2库的lib文件拷到了板子的/usr/lib下,然后测试程序和bmp图片放在了/usr下

离线

#6 2019-03-31 10:36:33

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 6,979

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

http://sdl.beuc.net/sdl.wiki/SDL_envvars

#SDL_VIDEODRIVER=fbcon ./test

离线

#7 2019-03-31 13:32:01

ArcherEmiya
会员
注册时间: 2019-03-10
累计积分: 6

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

晕哥 说:

http://sdl.beuc.net/sdl.wiki/SDL_envvars

#SDL_VIDEODRIVER=fbcon ./test

现在又显示SDL could not initialize! SDL_Error: fbcon not available
Failed to initialize!

我把SDL_FBDEV也设置了/dev/fb0

离线

#8 2019-03-31 15:23:54

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 6,979

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

刚刚下载 最新的 SDL 2.0 代码仔细研究, 发现居然没有 fbcon,

后来一番操作之后,  确认只有 1.2 版本才有 fbcon,

你用的应该是 2.0, 下载一个 1.2 版本再试一试.

离线

#9 2019-03-31 16:11:24

ArcherEmiya
会员
注册时间: 2019-03-10
累计积分: 6

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

晕哥 说:

刚刚下载 最新的 SDL 2.0 代码仔细研究, 发现居然没有 fbcon,

后来一番操作之后,  确认只有 1.2 版本才有 fbcon,

你用的应该是 2.0, 下载一个 1.2 版本再试一试.

谢谢晕哥,换了1.2.15的立马就出图像了,之前搞的晕死了,多谢大神

离线

#10 2019-03-31 16:14:22

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 6,979

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

哈, 解决就好,  日后有空过来持续挖坑.

离线

#11 2019-06-19 13:23:22

Jmhh247
会员
注册时间: 2018-12-21
累计积分: 89

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

不带你们这样玩的啊, 晕哥,SDL2还是要填坑的!!!


我用buildroot2017制作根文件系统,就是这荔枝派教程帖子里 https://whycan.cn/t_561.html ,目的是想用用ffplay。


所以选中ffmpeg和ffplay编译,因为ffplay需要SDL2支持,所以buildroot自动选中了SDL2。

buildroot编译成功后测试:ffplay xx.mp4

也是提示:Could not initialize SDL - No available video device。



一翻搜索,说是SDL2需要directfb。

buildroot选中directfb,继续编译测试。

设置export SDL_VIDEODRIVER=directfb,运行ffplay,显示:

Could not initialize SDL - directfb not available
(Did you set the DISPLAY variable?)


后面怎么破。。。

离线

#12 2019-06-19 13:53:20

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 6,979

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

ffplay 或许也支持 fbdev

https://www.ffmpeg.org/ffmpeg-devices.html

4.4.2 Examples
Play a file on framebuffer device /dev/fb0. Required pixel format depends on current framebuffer settings.

ffmpeg -re -i INPUT -c:v rawvideo -pix_fmt bgra -f fbdev /dev/fb0

离线

#13 2019-06-19 14:12:07

晕哥
Administrator
注册时间: 2017-09-06
累计积分: 6,979

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

https://whycan.cn/t_1356.html#p6702

我这个勾选 directfb 之后, cairo 就可以跑了。

离线

#14 2019-06-19 16:29:43

Jmhh247
会员
注册时间: 2018-12-21
累计积分: 89

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

晕哥 说:

https://whycan.cn/t_1356.html#p6702

我这个勾选 directfb 之后, cairo 就可以跑了。


这能说明directfb正常工作了吧,看帖子里你用的是SDL1。。。


晕哥,编译后,directfb需要怎么配置吗,就是那个directfbrc文件,还是免配置直接运行的

离线

#15 2019-06-19 17:07:43

nuvoton
会员
注册时间: 2019-06-17
累计积分: 11

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

应该是免配置的, 因为搜到的 ubuntu sdl2 ffplay 只要安装 sdl2 & directfb 包就可以跑。

或者你在这个地方跟踪进去, 看是什么原因导致错误:

directfb not available

离线

#16 2019-06-25 10:16:40

Jmhh247
会员
注册时间: 2018-12-21
累计积分: 89

Re: licheepi nano 移植SDL2运行程序报Illegal instruction

nuvoton 说:

应该是免配置的, 因为搜到的 ubuntu sdl2 ffplay 只要安装 sdl2 & directfb 包就可以跑。

或者你在这个地方跟踪进去, 看是什么原因导致错误:

directfb not available


从源码看还是video驱动的问题,有时间继续看看:

    /* Select the proper video driver */
    index = 0;
    video = NULL;
    if (driver_name == NULL) {
        driver_name = SDL_getenv("SDL_VIDEODRIVER");
    }
    if (driver_name != NULL) {
        for (i = 0; bootstrap[i]; ++i) {
            if (SDL_strncasecmp(bootstrap[i]->name, driver_name, SDL_strlen(driver_name)) == 0) {
                if (bootstrap[i]->available()) {
                    video = bootstrap[i]->create(index);
                    break;
                }
            }
        }
    } else {
        for (i = 0; bootstrap[i]; ++i) {
            if (bootstrap[i]->available()) {
                video = bootstrap[i]->create(index);
                if (video != NULL) {
                    break;
                }
            }
        }
    }
    if (video == NULL) {
        if (driver_name) {
            return SDL_SetError("%s not available", driver_name);
        }
        return SDL_SetError("No available video device");
    }

离线

页脚