我一直在尝试为一个应该使用 SDL2_image 库的项目创建一个基于 CMake 的构建系统。我不想强制用户在系统中安装任何库才能构建项目,因此我利用 CMake 的功能从源代码下载和构建依赖项(freetype、SDL2 和 SDL2_image)作为外部项目。
freetype 和 SDL2 一切都很好(都包含开箱即用的 CMakeLists.txt 文件),但我已经不知道如何让它适用于 SDL2_image。 CMake 的外部项目支持自定义配置和build设置,我在不同的变体中使用了这些设置,但没有成功。
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 ""
)
安error构建sdl2_image_project时发生。一些琐碎的研究发现,错误是由对 libdl 部分的 undefined reference 产生的。这是孔错误的一小部分:
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。如有任何建议,将不胜感激!
最佳答案
看起来您需要链接一些库,例如 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
...
关于cmake - 将 SDL2_image 构建为 CMake 外部项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25045057/