将SDL2_image构建为CMake外部项目

时间:2014-07-30 19:13:37

标签: cmake sdl-2 sdl-image

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

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

可以找到CMake文件本身here,但问题在于:

# 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 时出现error。一些微不足道的研究发现,错误是由对 libdl 部分的未定义引用产生的。这是洞错误的一小部分:

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'

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

经过大量的谷歌搜索后,我发现问题的可能来源是sdl2-config(在SDL_image构建过程中被称为为编译器获取一些标志)可能会被错误的参数调用并产生错误的cflags这让其他一切感到困惑。但我不确定是这种情况,也不知道如何影响来自CMake的sdl2_config来电(configure --help似乎没有为这种情况公布任何有用的选项。)

如果以任何方式重要,我正在运行Ubuntu 14.04 x64。非常感谢任何建议!

1 个答案:

答案 0 :(得分:2)

您似乎需要关联某些库,例如mdl。它可以通过提供来修复 自定义sdl2-config文件。从提取的存档中复制sdl2-config并替换--libs结果:

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

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

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