web-dev-qa-db-ja.com

SDL2 / SD2_imageをCMakeと静的にリンクする

SDL2をライブラリーとしてプロジェクトに追加しようとしています。静的にリンクしたい。私はc ++を初めて使います。

1-SDL Webサイトが可能な限り動的にリンクすることを推奨するのはなぜですか?

動的ライブラリの利点を理解しています。ただし、ユーザーが必要なすべてのライブラリーをすでにインストールしていて、システムに入る準備ができていると想定することは、かなり大きな想定IMOです。動的にリンクすることが私にとって良い考えのように聞こえる唯一のケースは、OS /プラットフォームに付属するよく知られたライブラリを使用している場合です。 https://wiki.libsdl.org/Installation

2-動的にリンクすると、(SDL2およびSDL2_image)の固有の依存関係が自動的に検出されます。静的リンクは行いません。これはなぜですか?これが私のFindSDL2_image.cmakeファイルです


find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h)
include_directories(${SDL2_IMAGE_INCLUDE_DIR})

# PREFER STATIC LIBRARIES ########
# cmake respects the order of extensions when looking for libraries
SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
# ------------------- ########

find_library(SDL2_IMAGE_LIBRARY NAMES SDL2_image PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX})
set(SDL2_IMAGE ${SDL2_IMAGE_LIBRARY})

これにより、sdl2_imageが静的にリンクされます。 Undefined symbols:が原因で正しくリンクできません。

  "_png_set_strip_16", referenced from:
      _IMG_LoadPNG_RW in libSDL2_image.a(IMG_png.o)
  "_png_set_write_fn", referenced from:
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)
  "_png_write_png", referenced from:
      _IMG_SavePNG_RW_libpng in libSDL2_image.a(IMG_png.o)

Cmakeファイルの### PREFER STATIC LIBRARIES ##セクションを削除すると、動的にリンクし、すべてが期待どおりに機能します。動的にリンクすると固有の依存関係が解決されるが、静的にリンクされない場合はなぜですか

---- UPDATE ----

依存関係を明示的に含めることで、sdl2_imageを静的にリンクすることができました

find_library(PNGLIB png)
find_library(JPEG jpeg)
find_library(TIFF tiff)
find_library(WEBP webp)
find_library(LZ z)

target_link_libraries(smb ${SDL2} ${PNGLIB} ${JPEG} ${TIFF} ${WEBP} ${SDL2_IMAGE} ${LZ})

しかし、これは私にはうまく拡張できません。これらの依存関係が何を推測し、グーグルするのかを理解する。理想的には、CMAKEでこれらを自動的に取得したいです。

4
FRR

CMakeでfind_packageを実行すると、いくつかのCMAKE定義のパスでFindxxx.cmakeファイルが検索されます。

このコマンドには、パッケージを検索するための「モジュール」モードと「構成」モードの2つのモードがあります。モジュールモードは、上記の縮小されたシグネチャでコマンドが呼び出されたときに使用できます。 CMakeは、CMAKE_MODULE_PATHでFind.cmakeというファイルを検索し、その後にCMakeをインストールします。

https://cmake.org/cmake/help/latest/command/find_package.html

そのため、ライブラリがどこにあるかを示す独自のFindSDL2.cmakeを定義する必要があります。 ( https://cmake.org/cmake/help/v3.17/manual/cmake-developer.7.html

自分のfind_packageを検索するには、FindSDL2.cmakeに向かって言う必要があります。パスをfind_packageに渡して、これを実行できます。

CMakeでファイルを使用する場合、変数${SDL2_INCLUDE_DIRS}および${SDL2_LIBRARIES} youは、ファイルで定義したものになります。

1

ここにいくつかの可能性があります。

最も簡単な説明は、動的libpng.so.xが、動的リンカーが見つけられる場所(/ usr/lib、/ usr/local/libなど)にインストールされているが、静的libpng.aがないことです。その場合の答えは、静的libpng.aをインストールし、cmakeの魔法で解決できるかどうかを確認することです。

次に簡単な説明は、システムにlibpng。*がなく、動的遅延バインディングが行われていることです。これは、たとえば、ビルドしているソフトウェアがlibpng。*もビルドしている場合に発生する可能性があります。この場合、実際にlibpngがまだ/ usrにインストールされていなくても、遅延バインディングによってアプリケーションを動的に正常にリンクできます。/libまたは/ usr/local/libまたはビルドしているソフトウェアが最終的に配置する場所。これは、鶏と卵のような状況です。これは、「ldd foo」を発行することでわかります。「foo」はアプリケーションの名前です。出力は、動的リンカーが実行可能ファイルのためにフェッチする必要のあるすべての買い物リストであり、libpngがリストに含まれ、解決されたパスがリストされているはずです(アプリケーションが起動する可能性があるが、その後クラッシュする可能性がない場合)たとえば、ある時点でpng_write_png()が呼び出された場合。これを回避する方法は、ビルドする前に、アプリケーションが期待するlibpng。*ライブラリをインストールすることです。

これが少し役立つことを願っています:)

0
Andrew Atrens