gpt4 book ai didi

c++ - 使用 CMake 静态链接 SDL2/SD2_image

转载 作者:行者123 更新时间:2023-12-01 14:04:36 31 4
gpt4 key购买 nike

我正在尝试将 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 自动拉入这些。

最佳答案

静态库仅仅是已编译目标文件的集合。它没有关于其依赖库的任何附加信息。您可以使用 ar -t <static_lib> 命令查看静态库的内容。因此,如果您需要将可执行文件链接到静态库,则必须提供其所有依赖库的名称和路径。

例如:考虑两个静态库,A 和 B,并假设 A 依赖于 B。那么如果想让你的 exe C 链接到 A,那么你的链接语句应该包含 A 和 B。那么只有所有符号都会正确定义。链接器:C ===> A 和 B

动态库与静态库不同,也更智能。它是 ELF 格式,它的头文件有关于它的依赖共享库的信息。这可以通过在其上发出 ldd <dynamic_lib> 命令来查看。动态加载器也知道在运行时从标准位置选择依赖库。如果找不到,就会报错。在您的情况下,您将在 ldd 输出中找到有关动态库的依赖库的信息,并且可能所有这些库都位于标准位置。这就是当您尝试动态链接时没有发现错误的原因。

这里有一些有用的链接,可以了解更多相关信息,
https://renenyffenegger.ch/notes/development/dynamic-loader
https://amir.rachum.com/blog/2016/09/17/shared-libraries/

关于c++ - 使用 CMake 静态链接 SDL2/SD2_image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61263289/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com