Сборка 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
...