我一直在尝试为一个应该使用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。非常感谢任何建议!
答案 0 :(得分:2)
您似乎需要关联某些库,例如m
和dl
。它可以通过提供来修复
自定义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
...