我正在尝试将SDL2作为库添加到我的项目中。我想静态地链接它。我不熟悉C++。
1-为什么SDL网站建议尽可能动态链接?
我了解动态库的好处。然而,假设用户已经安装了您需要的所有库,并准备好在他们的系统中使用,这是一个相当大的假设。 对我来说,动态链接听起来是个好主意的唯一情况是,您使用的是操作系统/平台附带的众所周知的库。 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 ##节。它动态链接,一切都按预期运行。为什么在动态链接时会解析内在依赖关系,但在静态链接时却不会?
-更新-
我能够通过显式包含sdl2_Image的依赖项来静态链接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自动拉入这些内容。