Linking SDL2/SD2_image statically with CMake(使用CMake静态链接SDL2/SD2_IMAGE)
问题描述
我正在尝试将SDL2作为库添加到我的项目中。我想静态地链接它。我不熟悉C++。
1-为什么SDL网站建议尽可能动态链接?
我了解动态库的好处。然而,假设用户已经安装了您需要的所有库,并准备好在他们的系统中使用,这是一个相当大的假设。
对我来说,动态链接听起来是个好主意的唯一情况是,您使用的是操作系统/平台附带的众所周知的库。
https://wiki.libsdl.org/InstallationFindSDL2_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自动拉入这些内容。
推荐答案
静态库只是编译的目标文件的集合。它没有关于其依赖库的任何附加信息。您可以使用ar -t <static_lib>
命令查看静态库的内容。因此,如果需要将可执行文件链接到静态库,则必须提供其所有依赖库的名称和路径。
例如:考虑两个静态库,A和B,并假设A依赖于B。那么,如果希望您的可执行文件C链接到A,那么您的LINK语句应该同时包含A和B,这样才能正确定义所有符号。
Linker:C=>A and B
动态库与静态库不同,而且更智能。它是ELF格式,其头文件包含有关其依赖的共享库的信息。这可以通过在其上发出ldd <dynamic_lib>
命令来查看。此外,动态加载器知道在运行时从标准位置挑选依赖库。如果它找不到,就会给出错误。在您的示例中,您将在ldd
输出中找到有关动态库的依赖库的信息,并且假设所有这些库都将位于标准位置。这就是当您尝试动态链接时找不到错误的原因。
这里有一些有用的链接,可以更多地了解这一点
https://renenyffenegger.ch/notes/development/dynamic-loader
https://amir.rachum.com/blog/2016/09/17/shared-libraries/
这篇关于使用CMake静态链接SDL2/SD2_IMAGE的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用CMake静态链接SDL2/SD2_IMAGE


基础教程推荐
- CString 到 char* 2021-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- 初始化列表*参数*评估顺序 2021-01-01
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01