gcc赢得';t编译SDL C程序(未定义对SDL函数的引用)

gcc赢得';t编译SDL C程序(未定义对SDL函数的引用),c,linux,gcc,sdl,C,Linux,Gcc,Sdl,我最近搬到了linux,在使用gcc编译SDLC程序时遇到了一个问题 我正在使用的命令: gcc `sdl-config --cflags --libs` -o main main.c 即使通过分离sdl配置标志: gcc `sdl-config --cflags` -c main.c gcc `sdl-config --libs` -o main main.o 我得到了同样的错误: /tmp/ccHYyjKd.o: In function `main': main.c:(.text+0xe

我最近搬到了linux,在使用gcc编译SDLC程序时遇到了一个问题

我正在使用的命令:

gcc `sdl-config --cflags --libs` -o main main.c
即使通过分离sdl配置标志:

gcc `sdl-config --cflags` -c main.c
gcc `sdl-config --libs` -o main main.o
我得到了同样的错误:

/tmp/ccHYyjKd.o: In function `main':
main.c:(.text+0xe): undefined reference to `SDL_SetMainReady'
main.c:(.text+0x18): undefined reference to `SDL_Init'
main.c:(.text+0x31): undefined reference to `SDL_SetVideoMode'
main.c:(.text+0x54): undefined reference to `SDL_MapRGB'
main.c:(.text+0x6b): undefined reference to `SDL_FillRect'
main.c:(.text+0x77): undefined reference to `SDL_Flip'
main.c:(.text+0x83): undefined reference to `SDL_WaitEvent'
main.c:(.text+0x90): undefined reference to `SDL_Quit'
collect2: error: ld returned 1 exit status
我非常简单的程序:

#include <stdio.h>
#include <stdlib.h>
#define SDL_MAIN_HANDLED
#include <SDL/SDL.h>

int main()
{   
    // SDL Initialize
    SDL_SetMainReady();
    SDL_Init(SDL_INIT_VIDEO);

    // Screen Initialize
    SDL_Surface *screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
    Uint32 screenColor = SDL_MapRGB(screen->format, 255, 255, 255);
    SDL_FillRect(screen, NULL, screenColor);
    SDL_Flip(screen);

    // Main Program Loop
    SDL_Event event;
    do
    {
        SDL_WaitEvent(&event);
    } while (event.type != SDL_QUIT);

    // SDL Quit
    SDL_Quit();

    return 0;
}
#包括
#包括
#定义SDL_MAIN_HANDLED
#包括
int main()
{   
//SDL初始化
SDL_SetMainReady();
SDL_Init(SDL_Init_视频);
//屏幕初始化
SDL_表面*屏幕=SDL_设置视频模式(640、480、32,SDL_表面);
Uint32 screenColor=SDL_MapRGB(屏幕->格式,255,255);
SDL_FillRect(屏幕、空、屏幕颜色);
SDL_翻转(屏幕);
//主程序循环
SDL_事件;
做
{
SDL_WaitEvent(&event);
}while(event.type!=SDL_QUIT);
//SDL退出
SDL_退出();
返回0;
}

使用gcc编译命令添加
-lSDL
。这将添加sdl库。在编译之前安装sdl开发包

编辑:

gcc -o out main.c -lSDL


使用gcc编译命令添加
-lSDL
。这将添加sdl库。在编译之前安装sdl开发包

编辑:

gcc -o out main.c -lSDL

gcc
的参数顺序非常重要。 阅读(以及
gcc
使用的文档)。然后替换

 gcc `sdl-config --libs` -o main main.o

更好的是,学习如何使用(它经常使用)和使用一个
Makefile
,灵感来自

另外,始终将
-Wall-g
传递到
gcc
,直到您的程序没有bug为止(然后使用
-Wall-O2

<强>从开源程序中获取灵感或使用.< /强>也考虑使用其他开源库和框架,例如,等等。学习他们的示例代码。

gcc的参数顺序非常重要。 阅读(以及
gcc
使用的文档)。然后替换

 gcc `sdl-config --libs` -o main main.o

更好的是,学习如何使用(它经常使用)和使用一个
Makefile
,灵感来自

另外,始终将
-Wall-g
传递到
gcc
,直到您的程序没有bug为止(然后使用
-Wall-O2


<强>从开源程序中获取灵感或使用.< /强>也考虑使用其他开源库和框架,例如,等等。并研究它们的示例代码。

我从/usr/include/SDL2/SDL_main.h中看到了这一点

/* *这是由真正的SDL主函数调用的,以让 *库知道初始化已正确完成。 * *在不知道自己在做什么的情况下自己打电话可能会导致 *应用程序出现崩溃和难以诊断的问题。 */ 外部声明无效SDL_SetMainReady(无效)

还请检查以下内容: nm/usr/lib/i386 linux gnu/libSDL.a | grep SDL_SetMainReady


这不是解决方案,但可以让您专注于真正的问题,我认为这不是编译过程。

我从/usr/include/SDL2/SDL_main.h中看到了这一点

/* *这是由真正的SDL主函数调用的,以让 *库知道初始化已正确完成。 * *在不知道自己在做什么的情况下自己打电话可能会导致 *应用程序出现崩溃和难以诊断的问题。 */ 外部声明无效SDL_SetMainReady(无效)

还请检查以下内容: nm/usr/lib/i386 linux gnu/libSDL.a | grep SDL_SetMainReady


这不是解决方案,但可以让您专注于真正的问题,我认为这不是编译过程。

非常感谢您的建议!这帮助我解决了一个关于在Linux下从未发现的SDL符号的古老谜团:-)正如评论中所说,gcc行的顺序是必不可少的。makefile编写得不好,这导致了您提到的损坏

作为总结,使用:gcc(标志)-o名称(包括et链接选项)

最后但并非最不重要的一点是,在x86_64下,使用gdb64而不是gdb(是下一个headhache;-)

例如,我自己编写了一个小Makefile(好吧,不是很好,但很有效)


谢谢你的建议!这帮助我解决了一个关于在Linux下从未发现的SDL符号的古老谜团:-)正如评论中所说,gcc行的顺序是必不可少的。makefile编写得不好,这导致了您提到的损坏

作为总结,使用:gcc(标志)-o名称(包括et链接选项)

最后但并非最不重要的一点是,在x86_64下,使用gdb64而不是gdb(是下一个headhache;-)

例如,我自己编写了一个小Makefile(好吧,不是很好,但很有效)

这个问题的“流行”答案没有一个是正确的或有效的。有些甚至与被问的问题无关。我也有同样的问题

SDL文档给出了如下编译示例:
gcc-o main.c`sdl2 config--cflags--libs`

然而,用户建议这是导致问题的参数顺序!!不是!事实上,他们建议的顺序是我从未见过的,当然也不是任何标准。这个网站上的SDL答案质量很低

更新: 我找到了一些缺失函数的解决方案。SDL2中不存在SDL_SetVideoMode。使用SDL_CreateWindow。

此问题的“流行”答案都不正确或有效。有些甚至与被问的问题无关。我也有同样的问题

SDL文档给出了如下编译示例:
gcc-o main.c`sdl2 config--cflags--libs`

然而,用户建议这是导致问题的参数顺序!!不是!事实上,他们建议的顺序是我从未见过的,当然也不是任何标准。这个网站上的SDL答案质量很低

更新:
我找到了一些缺失函数的解决方案。SDL2中不存在SDL_SetVideoMode。使用SDL_CreateWindow。

您是否安装了SDL开发包
# Makefile pour le contrôle du robot Arduino 
# Controle Robot
# Sauf mention contraire, tout est place sous Licence GPL V2
# Historique : 
# Etienne HAMON / création du makefile initial (d'après cours IFT1), Novembre 2014
#
# Corrections du Makefile : Eric Bachard décembre 2014 

CC = gcc
C_STANDARD = -std=c99
INCLUDE_DIR = inc -I/usr/include/SDL
SOURCES_DIR = sources
BUILD_DIR = build
APPLICATION_NAME = Controle
FILENAME = ${BUILD_DIR}/${APPLICATION_NAME}
CFLAGS = -Wall -ansi ${C_STANDARD}
LDFLAGS = -lSDL $(sdl-config --static-libs) -lm
DEBUG_SUFFIX = _debug
CFLAGS_DEBUG = -v -gdwarf-2 -DDEBUG
OBJS = ${SOURCES_DIR}/*.c

all : ${FILENAME} ${FILENAME}${DEBUG_SUFFIX}

${FILENAME}: ${OBJS}
    ${CC} ${CFLAGS} -o $@  $^ -I${INCLUDE_DIR} ${LDFLAGS} 

${FILENAME}${DEBUG_SUFFIX}: ${OBJS}
    ${CC} ${CFLAGS} ${CFLAGS_DEBUG} -o $@ $^ -I${INCLUDE_DIR} ${LDFLAGS} 

clean:
    ${RM} *.o ${FILENAME} ${FILENAME}${DEBUG_SUFFIX}
    ${RM} -rf ${BUILD_DIR}/*.dSYM