我一直在尝试为应该使用 SDL2_image 库的项目创建基于 CMake 的构建系统。我不想强迫用户在系统中安装任何库来构建项目,所以我利用 CMake 的能力从源代码中下载和构建依赖项(freetype、SDL2 和 SDL2_image)作为外部项目。
freetype 和 SDL2 一切都很好(它们都包括开箱即用的CMakeLists.txt文件),但我已经没有想法如何使它适用于 SDL2_image。CMake 的外部项目支持我在不同变体中使用的自定义配置和构建设置,但没有成功。
CMake 文件本身可以在这里找到,但有问题的部分是:
# 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的未定义引用产生的。这是孔错误的一小部分:
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代替(我实际上并不需要共享库 - 只是静态的,但是除了传递给 SDL2_image 配置脚本之外,我不知道如何防止构建系统尝试创建它--enable-shared=no
,这在这种情况下没有帮助)。
经过大量谷歌搜索后,我发现问题的可能根源是sdl2-config
(在 SDL_image 构建期间调用它以获取编译器的一些标志)可能会使用错误的参数调用并产生错误的 cflags,从而混淆其他一切。但我不确定情况是否如此,我也不知道如何影响sdl2_config
来自 CMake 的调用(configure --help
似乎没有为这种情况提供任何有用的选项)。
如果有任何问题,我正在运行 Ubuntu 14.04 x64。将不胜感激任何建议!