将SDL2 / SD2_image与CMake静态链接

问题描述 投票:1回答:1

我正在尝试将SDL2作为库添加到我的项目中。我想静态链接。我是C ++的新手。

1-为什么SDL网站建议尽可能地动态链接?

我了解动态库的好处。但是,假设用户将已经安装了所需的所有库并准备好将其放入系统中,这是IMO的一个很大的假设。在我看来,动态链接的唯一听上去是个好主意,那就是您使用OS /平台附带的众所周知的库。我确定我在这里丢失了一些东西,但是动态链接听起来像在启动时要求“找不到.dll”。 https://wiki.libsdl.org/Installation

2-动态链接似乎会自动找到(SDL2和SDL2_image)的固有依赖性。静态链接不是。为什么会这样?这是我的FindSDL2_image.cmake文件


find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h)
set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR})

# PREFER STATIC LIBRARIES ########
IF(MSVC)
    SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
ELSE(MSVC)
    SET(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
ENDIF(MSVC)
# ------------------- ########


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

这将静态链接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 ##部分。它动态链接,一切正常。为什么在动态链接时解决了固有依赖性,但在静态链接时却没有解决。

c++ cmake sdl-2 static-linking sdl-image
1个回答
1
投票

[当您在CMake中执行find_package时,将在某些CMAKE定义的路径中搜索Findxxx.cmake文件。

该命令有两种搜索包的模式:“模块”模式和“配置”模式。当使用上述简化签名调用命令时,模块模式可用。 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}将是您在文件中定义的变量。]​​>

© www.soinside.com 2019 - 2024. All rights reserved.