web-dev-qa-db-ja.com

SDL2ライブラリの静的リンク

私はWindows 7、Code :: BlocksおよびMinGWを使用しています。特にCode :: Blocksがmakefileを使用しない場合は、コンパイル/ビルドに関してはほとんど経験がありません。

http://www.libsdl.org/tmp/download-2.0.php からSDL2-devel-2.0.0-mingw.tar.gz(SDL開発ライブラリ)をダウンロードして、 SDL2ライブラリを使用してスタンドアロンの実行可能ファイルを作成するのが好きですが、これまでのところ、SDL2.dllファイルを実行可能ファイルにバンドルして機能させる必要がありました。

動的ライブラリを静的リンクできないと聞いたので、私の唯一のオプションは、上記のリンクからSDL2-2.0.0.tar.gz(ソースコード)ファイルを使用してソースファイルを処理することです。しかし、どうすればいいのかわかりません。

ソースファイルを試してみたところ、Visual StudioプロジェクトをCode :: Blocksにインポートしてビルドしましたが、「sdl-config No such file or directory」と表示されます(何が原因であるかわかりません)。また、ビルドによって実行可能ファイルが提供されるだけかどうかもわかりません。実行可能ファイルを自分の実行可能ファイルにリンクするために何ができるかわかりません。

ばか証明のばかの段階的なガイドは、このケースを解決するための最善の策でしょう。

編集:

Jonasが提供するガイドを使用してSDLライブラリをコンパイルし、libSDL2.aファイルを取得しました。

最初はlibSDL2.aのパスを「リンクライブラリ:」にのみ追加しましたが、Code :: Blocksのセクションですが、「SDL_Init()がこのスコープで宣言されていません」などの一連のエラーが発生しました。

LibSDL2.aパスに加えて、SDL2-2.0.0\includeのパスをコンパイラの検索ディレクトリに追加し、SDL2-2.0.0\build.libsのパスをリンカーの検索ディレクトリに追加しました。これをテストファイル#include "SDL.h"にも書き込みました。テストファイルは次のようになります。

#include "SDL.h"

int main( int argc, char* args[] ) {
    //Start SDL
    SDL_Init( SDL_INIT_EVERYTHING );
    //Quit SDL
    SDL_Quit();
    return 0;
}

宣言の問題は修正されたようですが、Code :: BlocksがSDL_mmjoystick.cファイルを開き、さらに多くのエラーが発生しました: "undefined reference to 'waveInClose @ 4'"、 "undefined reference to 'waveOutClose @ 4'"、 「 'joyGetNumDevs @ 0'への未定義の参照」および他の多くの参照。

何が起こっているかのスクリーンショットです。#includeテキストの色が違うことに注意してください。なぜそうなるのかはわかりません: http://gyazo.com/00656a9c1e57a2bd0db1414fa7d68ced.png

このライブラリを正しく使用する方法がわかりません。この場合、何か助けになりますか、それとも別の質問をしますか?

編集:

リンカーオプションに-lSDL2を追加し、他のパラメーターを削除しました。今ではうまくビルドされます:

mingw32-g++.exe -Wall -fexceptions  -g    -IC:\Users\User\Desktop\SDL2-2.0.0\include  -c "C:\Users\User\Desktop\CppProjects\SDL project\main.cpp" -o obj\Debug\main.o
mingw32-g++.exe -Wall -fexceptions  -g    -IC:\Users\User\Desktop\SDL2-2.0.0\include  -c "C:\Users\User\Desktop\CppProjects\SDL project\thetestfile.cpp" -o obj\Debug\thetestfile.o
mingw32-g++.exe -LC:\Users\User\Desktop\SDL2-2.0.0\build\.libs  -o "bin\Debug\SDL project.exe" obj\Debug\main.o obj\Debug\thetestfile.o   -lSDL2  ..\..\SDL2-2.0.0\build\.libs\libSDL2.a C:\Users\User\Desktop\SDL2-2.0.0\build\.libs\libSDL2.a  -mwindows
Output size is 945.80 KB
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 0 warnings (0 minutes, 1 seconds)

しかし、それを実行しようとすると、私のコンピュータにはSDL2.dllがないと書かれていますが、全体の目的は静的リンクでした。

したがって、現在、リンクライブラリ-settingsにbuild/.libsへのパスがあり、その他のリンカーオプションに-lSDL2があります。検索ディレクトリには、コンパイラとSDL2-2.0のSDL2-2.0.0/includeへのパスがあります。リンカーの0/build/.libs。

Build/.libsディレクトリでは、libSDL2.a、libSDL2.dll.a、libSDL2.la、およびlibSDL2.laiファイルも確認できます。これらのファイルは何なのかわかりません。

12
DispEd

ライブラリを再コンパイルする必要はありません。SDL2は、「SDL2-2.0.0\i686-w64-mingw32\lib \」フォルダーにある「libSDL2.a」という静的リンクライブラリで提供されます。

これらのオプションを必ずリンカーに追加してください。

"-lmingw32 -lSDL2main -lSDL2 -mwindows -lm -ldinput8 -ldxguid -ldxerr8 -luser32 -lgdi32 -lwinmm -limm32 -lole32 -loleaut32 -lshell32 -lversion -luuid -static-libgcc"

コード:ブロックの「プロジェクト/ビルドオプション... /リンケット設定/その他のリンカーオプション」

これらのオプションにより、SDL2.dllが使用していたものとリンクできます。

ファイル「SDL2-2.0.0\i686-w64-mingw32\bin\sdl2-config」で取得できます。

魔法のトリックは、フォルダー「SDL2-2.0.0\i686-w64-mingw32\lib \」にあるファイル「libSDL2.dll.a」を削除または名前を変更することです。必要なときに備えて、前に「-」を追加しました。

なぜこの書斎が他のものを克服するのか私にはわかりません。手がかりがいただければ幸いです。

私はCode :: Blocks 12.11 MinGW32で試してみましたが、うまくいきました。

ダイナミックリンクを使用するプロジェクトとスタティックリンクを使用する他のプロジェクトで実行する場合、「libSDL2main.a」がこれら2つに含まれることを認識して、ライブラリを2つの異なるフォルダーに保持する必要があります。

私の執筆にごめんなさい、私は英語で書くのに慣れていません。

マイク

15
Mike