关于sdl 2:将SDL2_image作为CMake外部项目构建

Building SDL2_image as a CMake external project

我一直在尝试为应该使用SDL2_image库的项目创建基于CMake的构建系统。我不想强迫用户在系统上安装任何库来构建项目,因此我利用了CMake的能力,可以从源代码作为外部项目下载和构建依赖项(freetype,SDL2和SDL2_image)。铅>

freetype和SDL2(都包括现成的CMakeLists.txt文件)对一切都很好,但是我已经耗尽了如何使它适用于SDL2_image的想法。 CMake的外部项目支持自定义配置和构建设置,我在不同的变体中使用了这些设置,但没有成功。

可以在这里找到CMake文件本身,但是有问题的部分是:

1
2
3
4
5
6
7
8
9
# SDL_image library
ExternalProject_Add(sdl2_image_project
    URL https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.0.0.tar.gz
    DEPENDS sdl2_project
    PREFIX ${LIBS_DIR}/SDL2_image
    CONFIGURE_COMMAND LDFLAGS=-L${SDL2_BIN} CFLAGS=-I${SDL2_SRC}/include SDL2_CONFIG=${SDL2_BIN}/sdl2-config <SOURCE_DIR>/configure --prefix=<INSTALL_DIR> --enable-shared=no
    BUILD_COMMAND make
    INSTALL_COMMAND""
)

构建sdl2_image_project时发生错误。一些琐碎的研究发现,错误是由未定义的libdl部分引用引起的。这是孔误差的一小部分:

1
2
3
libtool: link: gcc -I/home/snikitin/_src/img_glypher/libs/SDL2/src/sdl2_project/include -I/usr/local/include/SDL2 -D_REENTRANT -o showimage showimage.o -Wl,-rpath -Wl,/usr/local/lib -pthread  -L/home/snikitin/_src/img_glypher/libs/SDL2/src/sdl2_project-build ./.libs/libSDL2_image.a -L/usr/local/lib -lSDL2 -pthread
/home/snikitin/_src/img_glypher/libs/SDL2/src/sdl2_project-build/libSDL2.a(SDL_dynapi.c.o): In function `get_sdlapi_entry':
/home/snikitin/_src/img_glypher/libs/SDL2/src/sdl2_project/src/dynapi/SDL_dynapi.c:227: undefined reference to `dlopen'

我认为问题是由于链接器在将其链接到静态libSDL2.a时尝试创建共享版本的SDL2_image库而发生的。事情是-如果这是正确的-SDL2构建步骤会同时创建其自身的静态版本和共享版本,因此可以假设链接器将使用libSDL2-2.0.so(我实际上不需要共享库-只是静态库,但是除了将--enable-shared=no传递到SDL2_image配置脚本之外,我不知道如何防止构建系统尝试创建它,这在这种情况下无济于事。

经过大量的搜寻之后,我发现问题的可能根源是sdl2-config(在SDL_image构建期间被调用以获取用于编译器的一些标志)可能会被错误的参数调用并产生错误的cflag,从而引起混淆其他的一切。但是我不确定是否是这种情况,而且我也不知道如何影响CMake的sdl2_config调用(configure --help似乎没有揭示这种情况下的任何有用选项)。

如果有任何问题,我正在运行Ubuntu 14.04 x64。不胜感激任何建议!


看起来您需要链接一些库,例如mdl。可以通过提供来解决
自定义sdl2-config文件。从提取的存档中复制sdl2-config并替换--libs结果:

1
2
3
--libs)
  echo -L${exec_prefix}/lib -Wl,-rpath,${libdir} -pthread -lSDL2 -lm -ldl
  ;;

请注意,顺序很重要(这就是为什么仅修改LIBS对我不起作用)的原因。
现在,该文件可以在您的ExternalProject_Add命令中使用,而不是SDL2_CONFIG=${SDL2_BIN}/sdl2-config

1
2
3
...
... CFLAGS=-I${SDL2_SRC}/include SDL2_CONFIG=${CMAKE_CURRENT_LIST_DIR}/sdl2-config <SOURCE_DIR>/configure
...