【发布时间】:2020-04-17 02:43:02
【问题描述】:
我正在尝试将 SDL2 作为库添加到我的项目中。我想静态链接它。我是 C++ 新手。
1 - 为什么 SDL 网站建议尽可能动态链接?
我了解动态库的好处。但是,假设用户已经安装了您需要的所有库并准备好进入他们的系统,这是 IMO 的一个很大的假设。 对我来说,动态链接听起来是个好主意的唯一情况是,您使用的是操作系统/平台附带的众所周知的库。 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
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 自动将它们拉入。
【问题讨论】:
-
一切都按预期工作?我认为这可能有点为时过早.. 最好说一切似乎都按预期工作。 :) 'ldd' 对你的动态可执行文件有什么看法?动态链接器是否正在寻找并找到 libpng.so.x ?
标签: c++ cmake sdl-2 static-linking sdl-image