Сборка SDL2_image как внешний проект CMake

Я пытался создать систему сборки на основе CMake для проекта, который должен использовать библиотеку SDL2_image. Я не хочу заставлять пользователя устанавливать какие-либо библиотеки в систему, чтобы иметь возможность создавать проект, поэтому я воспользовался возможностью 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'

Я думаю, что проблема возникает из-за того, что компоновщик пытается создать общую версию библиотеки SDL2_image, связывая ее со статическим libSDL2.a. Дело в том, что - если это правильно - шаг сборки SDL2 создает как статическую, так и совместно используемую версии самого себя, поэтому можно предположить, что компоновщик будет использовать libSDL2-2.0.so вместо этого (на самом деле мне не нужна разделяемая библиотека - только статическая, но Я не знаю, как предотвратить сборку системы, пытаясь создать ее отдельно от прохождения --enable-shared=no в SDL2_image настроить скрипт, что не поможет в этом случае).

После долгих поисков я обнаружил, что возможный источник проблемы заключается в том, что sdl2-config (который вызывается для получения некоторых флагов для компилятора во время построения SDL_image) может быть вызван с неправильными аргументами и создает неправильные флаги, которые путают все остальное. Но я не уверен, что это так, а также я не знаю, как повлиять sdl2_config звонок из CMake (configure --help не раскрывает никаких полезных опций для этой ситуации).

Я использую Ubuntu 14.04 x64, если это имеет какое-либо значение. Буду признателен за любые советы!

1 ответ

Решение

Похоже, вам нужно связать некоторые библиотеки, такие как 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
...
Другие вопросы по тегам