cmake - 将 SDL2_image 构建为 CMake 外部项目

标签 cmake sdl-2 sdl-image

我一直在尝试为一个应该使用 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。如有任何建议,将不胜感激!

最佳答案

看起来您需要链接一些库,例如 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
...

关于cmake - 将 SDL2_image 构建为 CMake 外部项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25045057/

相关文章:

regex - CMake 正则表达式匹配

linux - 使cmake_check_build_system错误1

CMakeLists 多个源文件

go找不到sdl

c++ - SDL_TTF 渲染错误的地方

c++ - 如何修复这个执行错误?

c++ - 我如何在 KDevelop 中设置编译器选项?

c++ - SDL2 段错误

c - 由于带有图像表面阵列的 SDL_Flip,SDL 窗口关闭