>

환경 변수에서 물건을 찾기 위해 gcc를 올바르게 설정하는 방법을 이해하려고합니다.

현재 일부 코드, SDL을 컴파일하고 .bashrc에 추가하고 .bashrc도 소스했습니다.

다음은 간단한 hello 프로그램입니다.

#include "SDL.h"
#include "SDL_ttf.h"
#include "SDL_image.h"
#include "SDL_mixer.h"
#include <stdlib.h>
#include <stdio.h>
SDL_Window* window;
SDL_GLContext* main_context;
int main(int argc, char** argv) {
    printf("hello world %d  %c \n", argc, argv[0][argc]);

    if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
        SDL_Log("sdl failed to core_engine_init, %s", SDL_GetError());
        SDL_Quit();
        return -1;
    }
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,
                        SDL_GL_CONTEXT_PROFILE_CORE);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
    window = SDL_CreateWindow(
        "title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 300, 300,
        SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);

    if (NULL == window) {
        SDL_Log("SDL Failed to create window, %s", SDL_GetError());
        SDL_Quit();
        return -1;
    }
    main_context = SDL_GL_CreateContext(window);
    if (NULL == main_context) {
        SDL_Log("SDL failed to create main context, %s", SDL_GetError());
        SDL_Quit();
        return -1;
    }
    return 0;
}

gcc -o main main.c 로 이것을 컴파일하려고 시도  이 오류가 발생합니다 :

blubee$ gcc -o main main.c
/tmp/cc5hRcaO.o: In function `main':
main.c:(.text+0x3e): undefined reference to `SDL_Init'
main.c:(.text+0x47): undefined reference to `SDL_GetError'
main.c:(.text+0x59): undefined reference to `SDL_Log'
main.c:(.text+0x5e): undefined reference to `SDL_Quit'
main.c:(.text+0x77): undefined reference to `SDL_GL_SetAttribute'
main.c:(.text+0x86): undefined reference to `SDL_GL_SetAttribute'
main.c:(.text+0x95): undefined reference to `SDL_GL_SetAttribute'
main.c:(.text+0xa4): undefined reference to `SDL_GL_SetAttribute'
main.c:(.text+0xb3): undefined reference to `SDL_GL_SetAttribute'
main.c:(.text+0xd8): undefined reference to `SDL_CreateWindow'
main.c:(.text+0xf0): undefined reference to `SDL_GetError'
main.c:(.text+0x102): undefined reference to `SDL_Log'
main.c:(.text+0x107): undefined reference to `SDL_Quit'
main.c:(.text+0x11d): undefined reference to `SDL_GL_CreateContext'
main.c:(.text+0x135): undefined reference to `SDL_GetError'
main.c:(.text+0x147): undefined reference to `SDL_Log'
main.c:(.text+0x14c): undefined reference to `SDL_Quit'
collect2: error: ld returned 1 exit status

SDL2 링커 플래그를 추가하면 여전히 오류가 반환됩니다 :

blubee$ gcc -lSDL2 -o main main.c
/usr/bin/ld: cannot find -lSDL2
collect2: error: ld returned 1 exit status

이 명령은 모든 것을 잘 컴파일합니다

blubee$ gcc -I/opt/SDL2/include/SDL2 main.c -o main -L/opt/SDL2/lib -l
SDL2

문제는 내가 잘못했을 수도 있지만 이러한 경로를 내 .bashrc에 추가했다는 것입니다. 여기 내 bashrc가 있습니다.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/SDL2/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/SDL_IMAGE/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/SDL_TTF/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/SDL_MIXER/lib
export LD_RUN_PATH=$LD_RUN_PATH:/opt/SDL2/lib
export LD_RUN_PATH=$LD_RUN_PATH:/opt/SDL_IMAGE/lib
export LD_RUN_PATH=$LD_RUN_PATH:/opt/SDL_TTF/lib
export LD_RUN_PATH=$LD_RUN_PATH:/opt/SDL_MIXER/lib
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/SDL2/include/SDL2
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/SDL_IMAGE/include/SDL2
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/SDL_TTF/include/SDL2
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/SDL_MIXER/include/SDL2

이 환경 변수를 반향하면 변수가 있고 작동해야하지만 작동하지 않아야 함을 나타냅니다.

이 설정에 어떤 문제가 있습니까?

  • 답변 # 1

    환경 변수가 필요하지 않습니다. SDL2에서 사용하고자하는 올바른 cflags 및 ldflag를 전달하십시오.

    gcc main.c `pkg-config --cflags sdl2` -o main `pkg-config --libs sdl2`
    
    

    또는

    gcc main.c `sdl2-config --cflags` -o main `sdl2-config --libs`
    
    

    기억하십시오 : CFLAGS는 LDFLAGS보다 앞에오고 LDFLAGS (및 -l을 사용한 라이브러리 사양)는 마지막에옵니다

    SDL2는 sdl2-config 스크립트가 사전 설치되어 제공됩니다. 성공적으로 호출하려면 PATH를 상주하는 디렉토리로 설정해야합니다.

    export PATH=/opt/SDL2/bin:$PATH
    
    

    모든 * -config 명령을 직접 실행하면 올바른 cflags 및 ldflags 만 출력한다는 것을 알 수 있습니다. 이러한 스크립트를 사용하는 라이브러리는 일반적으로 단일 -I/-L 인수를 지정하는 것보다 크고 라이브러리에 단일 인수 -I/-L 인수를 지정하는 것이 이식 가능하지 않기 때문입니다. 향후 이러한 인수의 수를 늘릴 수 있기 때문입니다.

    그리고 모든 패키지를 자체 디렉토리에 설치해서는 안됩니다. /usr/local 에 모든 것을 설치하십시오  예를 들어, 아무것도 지정할 필요조차 없습니다 (대부분의 배포판은 /usr/local 를 가리 킵니다.  

    )

    내장 규칙 카탈로그에서 확인할 수 있습니다 :

    와이즈 비즈 와이즈 비즈  

    Linking a single object file

    에서 자동으로 이루어집니다  링커를 실행하여 (일반적으로   와이즈 비즈 C 컴파일러를 통해). 사용 된 정확한 레시피는 다음과 같습니다.

    n
    
    
    암시 적 규칙에 사용되는

    및 변수 :

    와이즈 비즈 와이즈 비즈 n.o 와 같은 . 라이브러리 ( ld )를 LDLIBS 변수에 추가해야합니다.   대신

    이 경우에는 $(CC) $(LDFLAGS) n.o $(LOADLIBES) $(LDLIBS)  LDFLAGS가 아닌 LDLIBS에 설정하거나 추가해야합니다.

    LDFLAGS

    Extra flags to give to compilers when they are supposed to invoke the linker,

  • 이전 debian - virtualbox를 제거 할 수 없습니다
  • 다음 USB 스틱의 데비안 부트 파티션