gcc コンパイルフラグの使用

gcc コンパイルフラグの使用

私は環境変数でエントリを見つけるためにgccを正しく設定する方法を理解しようとしています。

現在、私はSDLというコードをコンパイルして.bashrcに追加し、対応する.bashrcをインポートしました。

これは簡単なこんにちはプログラムです。

#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とldflagsを渡すだけです。

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自動的にそれを指します)。

おすすめ記事