我正在尝试将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 ##
部分。它动态链接,一切正常。为什么在动态链接时解决了固有依赖性,但在静态链接时却没有解决。
[当您在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}
将是您在文件中定义的变量。]>